Во-первых, я согласен с Николаем, вы привязываете свой клиентский сокет?
Если это так, похоже, что сокет на стороне сервера все еще находится в TIME_WAIT
и отбрасывает новую попытку подключения. Связывая клиентский сокет, вы заставляете сервер пытаться повторно использовать точно такое же соединение, которое в настоящее время находится в период ожидания 2MSL, оно не может быть повторно использовано в данный момент времени, и поэтому вы видите то, что видите , Обычно нет необходимости связывать клиентский порт, прекратите это делать, и ваша проблема, скорее всего, исчезнет.
Во-вторых, да, существуют ограничения на количество открытых сокетов на платформах Windows, но они связаны с ресурсами, а не с каким-либо жестко заданным числом.
Каждый открытый сокет использует некоторую память «не выгружаемого пула», и каждый ожидающий запрос чтения или записи на сокете также может использовать как «не выгружаемый пул», так и страницы памяти, заблокированные в памяти во время ввода-вывода (есть ограничение на количество страниц, которые могут быть заблокированы). Тем не менее, в Vista и более поздних версиях доступно гораздо больше «невыгружаемого пула», чем в более ранних версиях Windows, и даже тогда мне удалось добиться более 70 000 одновременных активных подключений на довольно малой спецификации XP (см. Здесь: http://www.lenholgate.com/blog/2005/11/windows-tcpip-server-performance.html). Обратите внимание, что есть несколько отдельных ограничений на количество исходящих соединений, которые вы можете установить (что, скорее всего, вас заинтересует), но это около 4000 по умолчанию и может быть настроено установкой MAX_USER_PORT
, см. Здесь: Максимальное количество одновременных соединений TCP / IP - Win XP SP3 для получения более подробной информации.