Слушатель Winsock TCP остается в состоянии LISTENING после успешного вызова closesocket () - PullRequest
1 голос
/ 26 января 2012

Я работаю над существующей библиотекой DLL, в которой создан прослушивающий сокет TCP и настроен на немедленное повторное связывание с этим сокетом с использованием SO_REUSEADDR в случае сбоя. Однако в настоящее время существует проблема, из-за которой слушатель остается в состоянии LISTENING даже после успешного вызова closesocket (); так как он не вводит TIME_WAIT, новый слушатель создается на том же порту при воссоздании сокета. Клиенты тогда не в состоянии соединиться с новым слушателем (предположительно). SO_LINGER установлен на 0 секунд. Нет ожидающих передач, когда сокет закрыт. Самая старая розетка закрывается примерно через десять секунд без видимого перехода в другое состояние.

Что может удерживать слушателя в состоянии LISTENING после успешного вызова closesocket ()?

1 Ответ

1 голос
/ 26 января 2012
  1. Вы закрыли неправильный сокет.
  2. Вы продублировали дескриптор и забыли закрыть дубликат.
  3. Кто-то еще отключил порт.
  4. Ваша ошибкаКод обнаруживает сбой прослушивателя, когда что-то другое является тем, что не удалось.
  5. Ваш слушатель сообщает о сбое, когда он не произошел.
  6. Ваш режим сбоя повреждает состояние, поэтому closesocket () закрывает что-то другое.
...