6

我正在用 C# 编写一个小彗星服务器,为了测试它,我编写了一个小程序,它打开一堆连接,向每个连接写入一点文本,然后关闭每个连接:

int basePort = 30000;
IPAddress localAddress = new IPAddress( new byte[] { 127, 0, 0, 1 } );
List<Socket> sockets = new List<Socket>();

for( int i = 0; i < 20000; i++ ) {
    Socket s = new Socket( AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp );
    s.Bind( new IPEndPoint( localAddress, basePort + i ) );
    s.Connect( "localhost", 1999 );
    sockets.Add( s );
}

string message = "hello";
byte[] messageData = Encoding.ASCII.GetBytes( message );
foreach( Socket s in sockets ) {
    s.Send( messageData );
}

foreach( Socket s in sockets ) {
    s.Disconnect( false );
}

我现在使用的是 Windows XP,它只分配从 1025 到 5000 范围的动态客户端端口,所以我添加了从 30000 开始的端口的显式绑定。这使我从 4000 以下的连接数增加到了 16000 多一点,但是现在我在 Socket.Connect 上收到以下异常:

“由于系统缺少足够的缓冲区空间或队列已满 127.0.0.1:1999,因此无法对套接字执行操作”

有什么想法吗?更改发送和接收缓冲区大小似乎没有任何区别,而且似乎总是我的客户端应用程序坏了,而不是我的服务器。我意识到在达到 100,000 个连接之前我将用完客户端端口,但我仍然想更好地了解发生了什么。

4

3 回答 3

3

您可能用完了非分页内存。每台机器和每进程的限制取决于安装的 RAM、操作系统、/3GB 开关设置等的数量。32 位操作系统 sku 对非分页内存的限制比 64 位操作系统 sku 低得多。

于 2009-05-25T14:21:48.593 回答
3

我认为 100.000 个连接不是一个可行的目标。

TCP/IP 端口是 16 位数字。所以任何高于 65535 的东西无论如何都是不行的。

于 2009-05-25T14:36:47.877 回答
1

Windows XP(可能还有其他版本)对任何时候允许的开放端口数量都有限制。此MSDN 文章可能有助于修改 TcpIp 参数以增加可用端口的数量并减少 Windows 在允许重用之前保持端口打开的时间。

于 2009-05-25T14:12:42.667 回答