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