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

У меня есть серверное приложение на основе Winsock, которое использует окна завершения ввода/вывода Windows Winsock.

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

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

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

  • Прекратить вызов WSAAccept().
  • Установите отставание на ноль, фактически запретив любое соединение для отложенного.
  • Выключение выключения() и closesocket() в гнезде для прослушивания.

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

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

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

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

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

Моя забота заключается в том, что этот подход может иметь некоторые побочные эффекты. Кто-нибудь может подтвердить?

1 ответ

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

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

licensed under cc by-sa 3.0 with attribution.