Kann ich Broadcast-Pakete auf einer einzelnen Maschine testen?

Kann ich Broadcast-Pakete auf einer einzelnen Maschine testen?

Ich möchte einen Server haben, der Broadcast-UDP-Pakete sendet, und zwei andere Clients auf derselben Maschine, die diese empfangen. Kann ich das irgendwie machen? Welche IP-Adresse würde ich verwenden?


@gravyface gab mir Hoffnung, aber ich habe es versucht:

  1. Der Server sendet an 127.255.255.255:54321 und die Clients hören auf 0.0.0.0:54321.
  2. Der Server sendet an 127.255.255.255:54321 und die Clients hören auf 127.0.0.1:54321.
  3. Der Server sendet an 127.255.255.255:54321 und die Clients hören an 127.255.255.255:54321.

Keiner davon hat funktioniert!:(

OBS: Ich verwende die Optionen REUSE_ADDR und SO_BROADCAST.

Antwort1

Erstes Fenster:

socat -u udp-recv:12345,reuseaddr -

Zweites Fenster:

socat -u udp-recv:12345,reuseaddr -

Drittes Fenster

socat - udp-sendto:127.255.255.255:12345,broadcast

Geben Sie dann im dritten Fenster ein paar Zeilen Text ein und prüfen Sie, ob in den beiden anderen Fenstern etwas angezeigt wird.

Ersetzen Sie „socat“ durch „strace -fe network socat“, um zu sehen, welche Systemaufrufe tatsächlich getätigt werden (vorausgesetzt, Sie verwenden Linux, andere Unix-Systeme haben Äquivalente, die manchmal tusc, struss oder dtruss heißen). socat ist Open Source und für die meisten Betriebssysteme sind Binärpakete verfügbar.

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

Oben binden die empfangenden „Clients“ an die Adresse INADDR_ANY. Was ich herausgefunden habe und nicht sicher bin, warum, ist, dass Sie die eingehenden Pakete nicht sehen, wenn Sie an eine Adresse im Loopback-Subnetz binden.

Siehe auch:

$ 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

Wenn die Clients an 127.0.0.0 oder 127.255.255.255 binden und der Server an dieselbe Adresse sendet (mit SO_BROADCAST), funktioniert es auch.

Antwort2

Senden von Broadcast-Verkehr an 127.255.255.255sollenfunktioniert, aber testen Sie es natürlich (und Wireshark/tcpdump ist hier Ihr Freund).

Natürlich müssen Ihre Clients auch auf dem Loopback-Gerät lauschen.

verwandte Informationen