【发布时间】:2012-03-18 06:10:10
【问题描述】:
假设我有一个带有一个真实网络接口和几个环回接口的 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 中已知的限制还是有可能以某种方式克服它?
感谢您的帮助!
【问题讨论】:
-
查看answer
-
谢谢,我已经阅读了那个帖子,但它并没有真正回答这个问题。我已经尝试过 CharlesO 的做法,但并没有真正奏效。
-
“注意客户端绑定到给定的接口”。为什么?
-
通常是因为 TCP/IP 限制每个 IP 地址的端口数。所以,我想要,例如在 interface1 上开放 64K 端口,在 interface2 上开放 64K 端口,依此类推。但是我可以在系统中所有接口上绑定的端口总数/总量仍然在 64K 左右。例如。这是帖子:stackoverflow.com/a/634547/1238124
标签: windows sockets networking iocp