2010-08-09 2 views
6

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

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

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

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

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

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

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

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

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

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

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

ответ

8

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

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

+0

Да, # 3 - правильный ответ. –

+0

Отличный ответ!«Доказательство» - это именно то, что мне нужно для спокойствия! Видишь ли, я боялся, что ассоциация новоприобретенной связи с гнездом для прослушивания IOCP создаст некоторую зависимость. Еще раз спасибо! – Poni