Windows限制每台机器同时打开的插槽/连接数

前端之家收集整理的这篇文章主要介绍了Windows限制每台机器同时打开的插槽/连接数前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
假设我的 Windows 7具有一个真实的网络接口和很少的环回接口.
我有启用IOCP的服务器,它接受来自客户端的连接.
我正在尝试尽可能多地模拟与服务器的真实客户端连接.

我的客户端代码只是建立了X个套接字连接
(请注意,客户端绑定到给定的接口):

const Int32 remotePort = 12345;
        const Int32 MaxSockets = 60000;

        Socket[] s = new Socket[MaxSockets];
        IPEndPoint bindEndpoint = new IPEndPoint(IPAddress.Parse(args[0]),0);
        for (Int32 i = 0; i < MaxSockets; i++)
        {
            s[i] = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
            s[i].SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.ReuseAddress,true);
            s[i].Bind(bindEndpoint);
            s[i].Connect(args[1],remotePort);

            IPEndPoint socketInfo = (IPEndPoint)s[i].LocalEndPoint;
            Console.WriteLine(String.Format("Connected socket {0} {1} : {2}",i,socketInfo.Address,socketInfo.Port));
        }

在环回接口上,我有几个用于绑定的IP.
另外,我还使用真实的界面进行绑定.
当打开的套接数量大约为每台机器64K时,我遇到了一个问题:

未处理的异常:System.Net.Sockets.SocketException:无法执行套接字上的操作,因为系统缺少足够的缓冲区空间或因为队列已满

我尝试了几个无助的东西,比如:
– 将MaxUserPort设置为最大值以及注册表中的其他一些建议的TCPIP设置.
– 尝试在不同的接口(真实接口和环回)上运行两个服务器并使用多个客户端.

它是Windows中的已知限制还是可以以某种方式克服它?

谢谢您的帮助!

解决方法

我在一些Microsoft页面上发现:

... HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\MaxUserPort
registry subkey is defined as the maximum port up to which ports may be allocated for wildcard binds. The value of the MaxUserPort registry entry defines the dynamic port range…

因此,如果我强制端点使用某个端口,例如

IPEndPoint bindEndpoint = new IPEndPoint(IPAddress.Parse(args[0]),54321);

然后我可以在系统中打开超过64K的同时套接字.

猜你在找的Windows相关文章