Я хочу, чтобы сервер отправлял широковещательные UDP-пакеты, а два других клиента на той же машине их получали. Можно ли это как-то сделать? Какой IP-адрес мне использовать?
@gravyface дал мне надежду, но я постарался:
- Сервер отправляет данные на 127.255.255.255:54321, а клиенты слушают на 0.0.0.0:54321.
- Сервер отправляет данные на 127.255.255.255:54321, а клиенты слушают на 127.0.0.1:54321.
- сервер отправляет данные на 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 вам в этом поможет).
Очевидно, что ваши клиенты также должны прослушивать устройство обратной связи.