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