SO_LINGER и закрывающие сокеты (WINSOCK)

Я пишу многопоточное приложение Winsock и у меня возникли проблемы с закрытием сокетов. Прежде всего, есть ли ограничение на количество одновременно открытых розеток? скажем, как 32 розетки все в один раз.

Я устанавливаю соединение на одном из сокетов и передаю информацию, и все идет как надо. проблема в том, что когда я отключаю сокет и затем снова подключаюсь к тому же месту назначения, я получаю RST от сервера после моего SYN. У меня нет кода для серверного приложения, поэтому я не могу его отладить.

когда я использовал SO_LINGER и он отправлял флаг RST в конце каждой сессии - это работало. но я не хочу разорвать мои связи таким образом. когда SO_LINGER не использовался, отправлялся флаг FIN, но, похоже, соединение не было действительно закрыто.

любая помощь? Спасибо

2 ответа

Во-первых, я согласен с Николаем, вы привязываете свой клиентский сокет?

Если это так, похоже, что сокет на стороне сервера все еще находится в TIME_WAIT и отбрасывает новую попытку подключения. Связывая клиентский сокет, вы заставляете сервер пытаться повторно использовать то же самое соединение, которое в настоящее время находится в период ожидания 2MSL, оно не может быть повторно использовано в данный момент времени, и поэтому вы видите то, что видите, Обычно нет необходимости связывать клиентский порт, прекратить это делать, и ваша проблема, скорее всего, исчезнет.

Во-вторых, да, существуют ограничения на количество открытых сокетов на платформах Windows, но они связаны с ресурсами, а не с каким-либо жестко заданным числом.

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

В Unix существует ограничение на количество дескрипторов файлов на процесс - я предполагаю, что в Windows это "дескрипторы".

Ты наверное bind()-включение вашего клиентского сокета в фиксированный порт. Это может быть причиной того, что сервер отклоняет ваше последующее соединение. Попробуйте нормальные эфемерные порты.

Другие вопросы по тегам