Странная проблема с UDP в Windows 10 - PullRequest
0 голосов
/ 23 мая 2018

У меня очень странная проблема в Windows 10. Отправка из одного сокета UDP в другой, оба через один и тот же локальный сетевой интерфейс, не работает.

  • Отправка в тот же UDPсокет работает как положено
  • Отправка на / с другого компьютера работает как положено
  • Если я использую интерфейс обратной связи (127.0.0.1), он работает как положено
  • Iпробовал несколько интерфейсов (отправка с интерфейса на себя) и даже разные адреса на одном и том же интерфейсе - похоже, ничего не работает.
  • Это работает, как и ожидалось, в Windows 7 и в Linux.
  • Портпривязка завершается успешно.

До нескольких дней назад она работала нормально, и я не знаю, что ее сломало.

Следующий скрипт ruby ​​демонстрирует проблему:

#!/usr/bin/env ruby

require 'socket'

addr = IPSocket.getaddress(Socket.gethostname)
u1 = UDPSocket.new
u1.bind(addr, 5010)
u2 = UDPSocket.new
u2.bind(addr, 5020)
u1.send('abcd', 0, addr, 5010)
p u1.recvfrom(4) # Works
u1.send('abcd', 0, addr, 5020)
p u2.recvfrom(4) # Fails

1 Ответ

0 голосов
/ 26 мая 2018

Одна вещь, которая может привести к сбою приведенного выше кода, это то, что есть что-то еще, слушающее UDP-пакеты на порту 5020 на этом компьютере, и этот другой приемник UDP поглощает ваш пакет, а u2 никогда не получает его.

Но моей следующей мыслью было бы то, что тогда ваш bind() должен сначала потерпеть неудачу, но есть опции сокетов, чтобы не вызывать его и позволить нескольким серверам прослушивать один и тот же порт.В этом случае случайно, какой сокет получает какой пакет.Это может объяснить то, что вы видите.

Я должен признать, что я не уверен, какова точная семантика bind() для Windows 10, и каково точное поведение, когда несколько серверов UDP прослушивают один и тот же порт (ивозможно ли это вообще в Windows 10).

Типичная семантика «Windows» для bind (): При привязке к ненулевому IP-адресу привязывать к сетевому интерфейсу, которому принадлежит этот IP-адрес.(В то время как в Linux это означает: фильтровать все входящие пакеты по адресу назначения с этим ненулевым IP-адресом при привязке к всем сетевым интерфейсам.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...