Windows对每台机器同时打开的套接字/连接数量的限制

比方说,我有一个真正的networking接口和几个回环接口的Windows 7。 我有IOCP启用服务器接受来自客户端的连接。 我试图尽可能模拟真正的客户端连接到服务器。

我的客户端代码只是build立了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左右时,我遇到了一个问题:

未处理的exception:System.Net.Sockets.SocketException:由于系统缺less足够的缓冲区空间或者队列已满,无法执行套接字上的操作

我已经尝试了几个无奈的事情: – 将MaxUserPort设置为最大值,并在registry中build议一些其他推荐的TCPIP设置。 – 尝试在不同的接口上运行两个服务器(实际接口和环回)并使用多个客户端。

在Windows中它是一个已知的限制,或者它有可能以某种方式克服它?

谢谢您的帮助!

Solutions Collecting From Web of "Windows对每台机器同时打开的套接字/连接数量的限制"

我在微软的一个页面上发现:

... HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\MaxUserPort注册表子项定义为端口可分配给通配符绑定的最大端口。 MaxUserPort注册表项的值定义动态端口范围…

所以,如果我强迫端点使用某个端口,例如

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

然后我可以在系统中打开多于64K的同步套接字。

在您的代码示例中,您正在调用Bind(bindEndpoint) ,但不显示bindEndpoint是如何定义的。 检查:

  • 你的系统实际上有多个IP地址(环回不算)
  • 实际上,您将端点的IP地址设置为IP地址(不是回送)
  • 绑定分布在多个IP地址上

环回地址不计算,因为许多系统专门处理它的路由和绑定的目的。 因此绑定到环回的端口可能会吸引所有地址上的端口,就像绑定到INADDR_ANY0.0.0.0 )一样。

TCP和UDP都使用无符号的16位整数来指定端口号。 我不认为在任何操作系统中的任何实现都将能够打开每个绑定地址超过65535个套接字。 另外,如果Windows没有为每个适配器或每个绑定地址实现完全隔离的状态表,而是依赖于一个全局状态表,我不会感到惊讶。 如果是这样的话,这将是一个Windows网络体系结构的限制,而不是一个软,可配置的限制。