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

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

Я хочу, чтобы сервер отправлял широковещательные 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.

решение1

Первое окно:

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), то это тоже работает.

решение2

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

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

Связанный контент