Создание 100 000 TCP-соединений с использованием .NET - PullRequest
6 голосов
/ 25 мая 2009

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

Ответы [ 3 ]

3 голосов
/ 25 мая 2009

Возможно, у вас заканчивается нестраничная память. Существуют лимиты для каждой машины и для каждого процесса, которые основаны на объеме установленной оперативной памяти, настроек переключателя / 3GB и т. Д. 32-разрядные ОС OS 'имеют гораздо более низкий предел для невыгружаемой памяти, чем 64-разрядные ОС OS.

3 голосов
/ 25 мая 2009

Я думаю, что 100 000 подключений - невыполнимая цель.

Порты TCP / IP являются 16-битными номерами. Так что все, что выше 65535, в любом случае не пойдет.

1 голос
/ 25 мая 2009

Windows XP (и, возможно, другие версии) имеют ограничения на количество открытых портов, разрешенных в любой момент времени. Этот MSDN articl e может быть полезен при изменении параметров TcpIp для увеличения количества доступных портов и уменьшения времени, в течение которого Windows удерживает порт открытым, прежде чем его можно будет повторно использовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...