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

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

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

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

любая помощь? Благодарность


person Johnny Walked    schedule 13.05.2010    source источник


Ответы (2)


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

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

person Nikolai Fetissov    schedule 13.05.2010

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

Если это так, похоже, что сокет на стороне сервера все еще находится в 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 для более подробной информации.

person Len Holgate    schedule 13.05.2010
comment
забыл упомянуть одну вещь. эта проблема не возникает, когда я запускаю его в однопоточном режиме - все подключается правильно. когда я одновременно запускаю 2 и более потоков отправки (каждый из которых открывает 16 разных сокетов для отправки на 16 разных серверов), где-то он не может подключиться - это варьируется. - person Johnny Walked; 15.05.2010
comment
Вы привязываете клиентские сокеты? - person Len Holgate; 15.05.2010