使用.NET创建100,000个TCP连接

时间:2009-05-25 13:52:37

标签: c# sockets comet

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

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个连接之前我将耗尽客户端端口,但我仍然想要了解更好的情况。

3 个答案:

答案 0 :(得分:3)

您可能正在耗尽非分页内存。每个机器和每个进程的限制基于安装的RAM,OS,/ 3GB开关设置等的数量.32位OS skus'对非页面内存的限制比64位OS sku低得多。

答案 1 :(得分:3)

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

TCP / IP端口是16位数字。所以任何超过65535的东西都是不行的。

答案 2 :(得分:1)

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