fragen stichworte

Kann ich Broadcast-Pakete auf einem einzelnen Computer testen?

Ich möchte, dass ein Server Broadcast-UDP-Pakete und zwei andere Clients auf demselben Computer sendet, die sie empfangen. Kann ich das irgendwie machen? Welche IP-Adresse würde ich verwenden?


@gravyface gab mir Hoffnung, aber ich versuchte es:

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

Keiner von ihnen hat funktioniert! :(

OBS: Ich verwende die Optionen REUSE_ADDR und SO_BROADCAST.

antworten

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 Textzeilen ein und prüfen Sie, ob in den beiden anderen Zeilen etwas angezeigt wird.

Ersetzen Sie "socat" durch "strace -fe network socat", um zu sehen, welche Systemaufrufe tatsächlich ausgeführt werden (vorausgesetzt, Sie verwenden Linux, andere Unices haben Äquivalente, die manchmal als tusc, struss oder dtruss bezeichnet werden). socat is opensource und binäre Pakete sind für die meisten Betriebssysteme 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 INADDR_ANY-Adresse. Was ich gefunden habe und nicht sicher ist, warum, ist, dass, wenn Sie an eine Adresse im Loopback-Subnetz binden, die eingehenden Pakete nicht angezeigt werden.

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 sich die Clients an 127.0.0.0 oder 127.255.255.255 binden und der Server an dieselbe Adresse sendet (mit SO_BROADCAST), funktioniert dies ebenfalls.

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

Natürlich müssen Ihre Kunden auch auf dem Loopback-Gerät zuhören.