Winsock - прекратите признавать, что новые соединения все же сохраняют коммуникацию с существующими соединениями

У меня есть базирующееся серверное приложение Winsock, которое использует Windows Winsock I/O Completion Ports.

По сути, каждое принятое соединение связано с сокетом слушания, чтобы начать получать уведомления (чтение, запишите, закройтесь и т.д.').
Сокет слушания имеет отставание 100 незаконченных соединений.
Все хорошо.

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

Я полагал, что мог сделать один из:

  1. Прекратите называть WSAAccept ().
  2. Обнулите отставание, эффективно не разрешив любому соединению ожидать.
  3. Назовите завершение работы () и closesocket () на сокете слушания.

Теперь, опция № 1 дает ожидаемые результаты; Мое приложение не обрабатывает новые соединения, НО оно действительно принимает до суммы отставания (100). Связи практически установлены - я не хочу это!

Опция № 2; я могу сделать это? Как? Не удалось найти на MSDN, ни Google. Документация слушает () в MSDN, говорит;

Если слушать функция будет вызвана на уже сокете слушания, то она возвратит успех, не изменяя значение для неудовлетворенного параметра. Установку неудовлетворенного параметра на 0 в последующем вызове для слушания на сокете слушания не считают надлежащим сбросом, особенно если существуют соединения на сокете.

Не хороший для меня.
Если бы я мог бы сделать так безопасным способом, которым я объединил бы его с опцией № 1, эффективно действительно остановившись устанавливающий любые новые соединения на машине (через порт прослушивания!).

Опция № 3 на самом деле работает; После закрытия слушания снабжают сокетом, я могу все еще общаться с существующими соединениями, и отставания не стало (хорошо, закрыл сокет слушания!).

Мое беспокойство - то, что этот подход мог бы иметь некоторые побочные эффекты. Кто-либо может подтвердить?

7
задан sth 9 August 2010 в 21:52
поделиться

1 ответ

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

Например, в документации Microsoft есть пример серверного приложения , в котором демонстрируется базовое использование сокетов. Там прослушивающий сокет закрывается до того, как будет завершена связь через принятый сокет (до цикла do-while).

9
ответ дан 7 December 2019 в 03:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: