Сокет прослушивания неожиданно умирает

У меня проблема с тем, что TCP-сокет прослушивает порт и прекрасно работает очень долгое время - он обрабатывает несколько соединений и, кажется, работает безупречно. Однако иногда при вызове accept() для создания нового соединения вызов accept() завершается неудачно, и я получаю следующую строку ошибки из системы:

10022: An invalid argument was supplied.

Очевидно, это может произойти, когда вы вызываете accept() для сокета, который больше не слушает, но я сам не закрывал сокет и не был уведомлен о каких-либо ошибках в этом сокете.

Кто-нибудь может подумать о каких-либо причинах, по которым прослушивающий сокет может прекратить прослушивание или как может генерироваться упомянутая выше ошибка?

3 ответа

Решение

Некоторые возможности:

  • Другая часть вашего кода изменила значение дескриптора. Проверьте, не изменилась ли она (сохраните копию в другом месте и сравните, распечатайте ее, остановите точку записи в отладчике и т. Д.).

  • Что-то закрыло ручку.

  • Взаимодействие с глючной Winsock LSP.

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

Одна вещь, которая приходит мне в голову, это режим ожидания системы или режима гибернации. Я не уверен, как эти события обрабатываются библиотекой winsock. Возможно, сетевой интерфейс (частично) отключен.

Другие вопросы по тегам