Сокет прослушивания UDP прекращает прослушивание после изменения конфигурации сети

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

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

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

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

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

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

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

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

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

EDIT2: Только что обнаружил, что если я пишу в сокет (отправляю фиктивный пакет куда угодно), он снова начинает работать...


person Vargas    schedule 13.10.2011    source источник
comment
вы можете добавить тег(и) с соответствующими версиями Windows   -  person jgauffin    schedule 21.10.2011
comment
по какому адресу привязан сокет?   -  person User    schedule 15.01.2013


Ответы (1)


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

person dvasanth    schedule 24.05.2014