每台服务器的连接数?C#,网络

每台服务器的连接数?C#,网络,c#,.net,httpwebrequest,C#,.net,Httpwebrequest,我正在连接到第三方服务器。我知道现在他们允许来自同一个远程用户的8个连接。但是我不知道他们是否会提高或降低连接限制。因此,我希望我的应用程序能够动态地找到答案。我该怎么做 我用的是C#,MSVS2008 我开始悬赏任何能给我工作机会的人。如果没有人这么做,我会给出最好的答案 我发现这很难做到,并且有几次尝试都失败了:(这不是服务器默认向客户端提供的信息。唯一知道的方法是一直打开连接,直到连接失败为止(坏主意),或者让服务器所有者提供一个您可以轮询的服务,返回此信息 编辑:在进一步思考这个问题后,

我正在连接到第三方服务器。我知道现在他们允许来自同一个远程用户的8个连接。但是我不知道他们是否会提高或降低连接限制。因此,我希望我的应用程序能够动态地找到答案。我该怎么做

我用的是C#,MSVS2008 我开始悬赏任何能给我工作机会的人。如果没有人这么做,我会给出最好的答案


我发现这很难做到,并且有几次尝试都失败了:(

这不是服务器默认向客户端提供的信息。唯一知道的方法是一直打开连接,直到连接失败为止(坏主意),或者让服务器所有者提供一个您可以轮询的服务,返回此信息

编辑:在进一步思考这个问题后,我不确定是否可以通过“探测”以任何真实的准确度来确定。如果服务器在达到连接限制时返回
503服务器忙
(我在提出最初建议时假设会发生这种情况),这将更容易测试。但通常,当服务器超过其连接限制时,它们只是在新连接可用之前不响应。客户端只是等待响应。没有什么困难的方法来区分由于已达到连接限制而需要10秒响应的服务器和需要10秒响应的服务器10秒以响应任何其他原因

此外,即使您仍试图以这种方式对其进行测试,您向服务器发出的请求也需要保持足够长的打开时间,以确保您创建的第一个连接(以及所有后续连接)能够正常运行当第n个请求超时时仍处于打开状态。这意味着调用需要花费任意长时间才能返回的服务—长时间运行的进程或线程.Sleep();或者下载一个不方便的大文件。这两种方法都是极为低效的。

此处有一些伪代码:

connection = MakeNewConnection("ServerAddress");
while (connection.connected)
{
connectionCounter++;
connection = MakeNewConnection("ServerAddress");
}
最后,你的connectionCounter应该包含你能建立的全部连接。如果你愿意,我可以看看这需要什么样的C代码


另外,这对服务器不是一件很好的事情,它可能会在一天内让你被禁止:p.

如果你连接的服务器是一个Windows box并且正在运行WMI,你只需找出此信息存储在哪个注册表项中,然后在那里获取信息。也就是说,如果你连接的用户具有WMI权限幻觉

int counter = 0;
while(true) {

     try{
            Open New Connection
            counter++;

        }
        catch()
        {
           Trace.WriteLine(counter);
        }
}

必须喜欢使用异常来控制流;)

穷人的做法是向netstat发送shell,获取标准输出并检查它。它为您提供与其他计算机的当前连接的快照。从中可以确定连接到特定服务器的次数

-不要

我不能评论:)但答案是可靠的。根据您需要监控服务的时间长短,您可以安排netstat以管道形式输出到一个文件,并在时间段结束时查看数据

要清理输出数据以查看所需内容,可能需要结合使用logparser和或excel

netstat的好处在于,您可以消除“喋喋不休”,只需查看连接到感兴趣的进程的连接(通过pid)


否则,您可以通过tcpv4(或v6)perfmon计数器使用tcp监视到服务器的连接数。此连接将包括到服务器的所有连接,但您可能能够大致了解您要查找的内容。

在您的情况下,更好的方法可能是不真正关心。我会尝试逐个打开连接并检查应用程序的性能。只要通过打开另一个连接来提高性能,就可以继续打开新的连接。当性能停止增加时,您的连接数已接近最佳连接数。

我将接受这笔奖金,好先生。不太清楚你为什么要这样做,为什么有人允许8个连接

1999年定义(RFC 2616)“客户 使用持久连接的 限制同时发生的事件的数量 它们维护的与服务器的连接 给定服务器。单用户客户端 不应保持超过2个 与任何服务器或代理的连接。 代理最多应使用2*N 与另一台服务器或服务器的连接 proxy,其中N是 同时活跃的用户 指导方针旨在改进 HTTP响应时间和避免 因为开发商 使用AJAX或类似AJAX的请求 更新网页http限制为 讨论越来越多

正如RFC所说,我只能获得两个到web服务器的开放连接

但代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Threading;

namespace ConnectionTest
{
    public class RequestCounter
    {
        public int Counter = 0;
        public void Increment()
        {
            Interlocked.Increment(ref Counter);
        }
    }

    public class RequestThread
    {
        public AutoResetEvent AsyncWaitHandle { get; private set; }
        public RequestCounter RequestCounter;
        public String Url;
        public HttpWebRequest Request;
        public HttpWebResponse Response;

        public RequestThread(AutoResetEvent r, String u, RequestCounter rc)
        {
            Url = u;
            AsyncWaitHandle = r;
            RequestCounter = rc;
        }

        public void Close()
        {
            if (Response != null)
                Response.Close();

            if (Request != null)
                Request.Abort();
        }
    }

    public class ConnectionTest
    {
        static void Main()
        {
            string url = "http://www.google.com/";
            int max = GetMaxConnections(25, url);
            Console.WriteLine(String.Format("{0} Max Connections to {1}",max,url));
            Console.ReadLine();
        }

        private static int GetMaxConnections(int maxThreads, string url)
        {
            RequestCounter requestCounter = new RequestCounter();

            List<RequestThread> threadState = new List<RequestThread>();
            for (int i = 0; i < maxThreads; i++)
                threadState.Add(new RequestThread(new AutoResetEvent(false), url, requestCounter));

            List<Thread> threads = new List<Thread>();
            foreach (RequestThread state in threadState)
            {
                Thread t = new Thread(StartRequest);
                t.Start(state);
                threads.Add(t);
            }

            WaitHandle[] handles = (from state in threadState select state.AsyncWaitHandle).ToArray();
            WaitHandle.WaitAll(handles, 5000); // waits seconds

            foreach (Thread t in threads)
                t.Abort();

            foreach(RequestThread rs in threadState)
                rs.Close();

            return requestCounter.Counter;
        }

        public static void StartRequest(object rt)
        {
            RequestThread state = (RequestThread) rt;
            try
            {
                state.Request = (HttpWebRequest)WebRequest.Create(state.Url);
                state.Request.ReadWriteTimeout = 4000; //Waits 4 seconds

                state.Response = (HttpWebResponse)state.Request.GetResponse();
                if (state.Response.StatusDescription.Equals("OK", StringComparison.InvariantCultureIgnoreCase))
                    state.RequestCounter.Increment();

                //Do not close, or you will free a connection. Close Later
                //response.Close(); 
            }
            catch (WebException e)
            {
                //Console.WriteLine("Message:{0}", e.Message);
                state.Close();
            }
            catch (ThreadAbortException e)
            {
                //Console.WriteLine("Thread Aborted");
                state.Close();
            }
            catch(Exception e)
            {
                //Console.WriteLine("Real Exception");    
                state.Close();
            }
            finally
            {
                state.AsyncWaitHandle.Set();
            }
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
Net系统;
使用系统线程;
名称空间连接测试
{
公共类请求计数器
{
公共整数计数器=0;
公共空间增量()
{
联锁增量(参考计数器);
}
}
公共类请求线程
{
公共自动resetEvent AsyncWaitHandle{get;private set;}
公共请求计数器请求计数器;
公共字符串Url;
公共HttpWebRequest请求;
公共HttpWebResponse;
公共请求线程(自动resetEvent r、字符串u、请求计数器rc)
{
Url=u;
AsyncWaitHandle=r;
RequestCounter=rc;
}
公众假期结束()
{
if(响应!=null)
Response.Close();
if(请求!=null)
Request.Abort();
}
}
公共类连接测试
{
静态void Main()
{
字符串url=”http://www.google.com/";
int max=GetMaxConnections(25,url);
WriteLine(String.Format(“{0}Max连接到{1}”,Max,url));
Console.ReadLine();
}
私有的