2010-05-13 1 views
3

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

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

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

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

ответ

1

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

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

2

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

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

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

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

+0

забыл упомянуть одно. эта проблема не возникает, когда я запускаю ее однопоточным - все это правильно соединяется. , когда я одновременно запускаю 2 и выше отправки потоков (каждый открывает 16 различных сокетов для отправки на 16 разных серверов), где-то он не может подключиться - он меняется. –

+0

Вы связываете клиентские сокеты? –