Я пишу небольшой сервер Comet на 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 подключений, но я все еще хотел бы понять, что происходит немного лучше.