Winsock - прекратить прием новых подключений, сохраняя связь с существующими подключениями - PullRequest
7 голосов
/ 10 августа 2010

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

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

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

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

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

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

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

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

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

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

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

1 Ответ

9 голосов
/ 10 августа 2010

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

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

...