Назад | Перейти на главную страницу

Могу ли я протестировать широковещательные пакеты на одной машине?

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


@gravyface дал мне надежду, но я попробовал:

  1. Сервер отправляет на 127.255.255.255:54321, а клиенты слушают 0.0.0.0:54321.
  2. Сервер отправляет на 127.255.255.255:54321, а клиенты слушают 127.0.0.1:54321.
  3. сервер отправляет на 127.255.255.255:54321, а клиенты слушают 127.255.255.255:54321.

Ни один из них не работал! :(

OBS: я использую параметры REUSE_ADDR и SO_BROADCAST.

Первое окно:

socat -u udp-recv:12345,reuseaddr -

Второе окно:

socat -u udp-recv:12345,reuseaddr -

Третье окно

socat - udp-sendto:127.255.255.255:12345,broadcast

Затем введите несколько строк текста в третье окно и посмотрите, получаете ли вы что-нибудь в двух других.

Замените «socat» на «strace -fe network socat», чтобы увидеть, какие системные вызовы фактически выполняются (если вы работаете в Linux, у других юниксов есть эквиваленты, иногда называемые tusc, struss или dtruss). socat имеет открытый исходный код, и бинарные пакеты доступны для большинства операционных систем.

socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP) = 3
setsockopt(3, SOL_SOCKET, SO_BROADCAST, [1], 4) = 0
sendto(3, "qwe\n", 4, 0, {sa_family=AF_INET, sin_port=htons(12345), sin_addr=inet_addr("127.255.255.255")}, 16) = 4

Выше принимающие «клиенты» связываются с адресом INADDR_ANY. Что я обнаружил и не знаю почему, так это то, что если вы привязываетесь к адресу в подсети loopback, вы не видите входящих пакетов.

Смотрите также:

$ ip route show table local dev lo scope link
broadcast 127.0.0.0  proto kernel  src 127.0.0.1
broadcast 127.255.255.255  proto kernel  src 127.0.0.1

Если клиенты связываются с 127.0.0.0 или 127.255.255.255 и сервер отправляет на тот же адрес (с SO_BROADCAST), то он также работает.

Отправка широковещательного трафика на 127.255.255.255 должен работает, но, очевидно, проверьте это (и Wireshark / tcpdump здесь ваш друг).

Очевидно, что ваши клиенты также должны прослушивать устройство обратной связи.