У меня есть серверное приложение на основе Winsock, которое использует порты завершения ввода / вывода Windows Winsock.
Таким образом, каждое принятое соединение связано с прослушивающим сокетом, чтобы начать получать уведомления (чтение, запись, закрытие и т. Д. ').
Сокет прослушивания имеет невыполненную очередь из 100 ожидающих соединений.
Все хорошо.
В какой-то момент я хочу прекратить принимать новые соединения, но поддерживать связь с уже подключенными существующими подключенными сокетами.
Я подумал, что мог бы сделать одно из:
- Прекратить вызывать WSAAccept ().
- Установить отставание в ноль, фактически запретив любое соединение в состоянии ожидания.
- Вызовите shutdown () и closesocket () для слушающего сокета.
Теперь, опция # 1 дает ожидаемые результаты;Мое приложение не обрабатывает новые соединения, НО оно принимает до суммы отставания (100).Соединения практически сделаны - я не хочу этого!
Option # 2 ;Могу ли я сделать это?Как?Не удалось найти ни в MSDN, ни в Google.Документация listen () в MSDN говорит;
Если функция прослушивания вызывается на уже прослушиваемом сокете, она вернет успех без изменения значения параметра backlog.Установка параметра backlog равным 0 при последующем вызове для прослушивания на прослушивающем сокете не считается правильным сбросом, особенно если в сокете есть соединения.
Не подходит для меня.
ЕслиЯ мог бы сделать это безопасным способом, я бы комбинировал его с вариантом № 1, фактически прекратив устанавливать любые новые соединения на машине (через порт прослушивания!).
Опция # 3 на самом деле работает;После закрытия прослушивающего сокета я все еще могу обмениваться данными с существующими соединениями, и отставание ушло (ну, закрыто прослушивающее сокет!).
Меня беспокоит, что этот подход может иметь некоторые побочные эффекты.Кто-нибудь может подтвердить?