SO_LINGER и закрывающие сокеты (WINSOCK) - PullRequest
3 голосов
/ 13 мая 2010

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 13 мая 2010

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

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

2 голосов
/ 13 мая 2010

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

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

...