Прослушивающий сокет UDP прекращает прослушивание после изменений конфигурации сети - PullRequest
6 голосов
/ 13 октября 2011

У меня есть UDP-сокет, прослушивающий порт для широковещательной передачи, и он работает нормально.

Однако, когда я перехожу в спящий режим и возобновляю работу ОС (Windows 7), сокет просто перестает получать данные (и яможно увидеть, что есть данные, поступающие с помощью Wireshark).

Это также происходит, если я изменяю какие-либо сетевые настройки, например, меняю свой IP-адрес, отключаю и включаю сетевой адаптер.

Похоже, что ОС отключает все сетевые адаптеры при переходе в спящий режим и повторно включаетих, когда это возобновится.

select просто возвращает 0 (время ожидания), которое ничем не отличается от того, когда я не получаю никаких данных.Я нигде не смог найти ссылки на это поведение.

Если я закрою сокет и воссоздаю его, он снова начнет работать.

Мои прослушивающие сокеты TCP все еще работают нормально после возобновления работы ОС.

Есть какие-нибудь идеи о том, как обнаружить и исправить эту ситуацию?

РЕДАКТИРОВАТЬ : он по-прежнему принимает данные напрямую, просто отлично, он просто больше не принимает передачи в широковещательном режиме.

EDIT2: Просто обнаружил, что если я пишу в сокет (отправляю пустой пакет в любое место), он снова начинает работать ...

1 Ответ

1 голос
/ 24 мая 2014

Я думаю, что ваш код явно не привязывает сокет к адресу "0.0.0.0". Поэтому, когда вы отправляете, он привязывает IP-интерфейс, который доступен в то время. Когда этот IP-адрес изменяется или интерфейс отключен, этот сокет будет сброшен стеком TCP / IP. В вашем TCP-сокете вы должны были привязать адрес «0.0.0.0», чтобы он всегда прослушивал соединение независимо от любых изменений IP / интерфейса. Вы можете сделать так, чтобы ваш сокет udp был привязан к «0.0.0.0» перед отправкой любых данных на нем. Это заставит его работать даже после гибернации или смены IP-адреса.

...