On Friday 28 August 2009, Marcus Obst wrote:
bisher habe ich (anscheinend) in dem Irrglauben gelebt, dass IP-Pakete (UDP, ICMP), wenn man sie an die ,,Broadcast''-Adresse 255.255.255.255 schickt, auf *ALLEN* physikalischen Netzwerkkarten ausgesendet werden...
Dem scheint allerdings bei genauem hinschauen nicht so zu sein.
Korrekt. 255.255.255.255 ist der Link-Level-Broadcast bei IPv4. Das bedeutet der Rechner hat keine Ahnung auf welcher Karte er das Paket rausschicken soll. Du musst es ihm sagen.
Das ,,Broadcast''-Paket kommt unter Linux im besten Falle auf einem der verfügbaren Interface heraus. Hat man keine Default-Route oder womöglich 255.255.255.255 nicht direkt in der Routing-Tabelle eingetragen, wird das Paket gar nicht versendet und man bekommt ,,Network unreachable''.
Woher soll er auch wissen was Du willst?
(Im Prinzip ist das ja auch logisch, wenn nix in der Rouring-Tabelle steht, weiß er auch nicht wohin damit)
Aber irgendwie habe ich mir bisher eingebildet das soetwas ginge?
So wie es aussieht, gibt es also unter Linux keine einfache/automatische Möglichkeit ein Pakete auf allen n-Interfacen auszusenden (es sei den man sendet es n-mal per Hand).
Du musst auf jedes Interface einzeln senden.
(Auch wenn es fast Off-Topic ist, unter Windows scheint das ganze anders gelöst zu sein. Dort existiert per Default eine 255.255.255.255-Route für jedes Network-Device und der IP-Stack scheint auch dafür zu sorgen, dass ein Broadcast-Paket dann auf allen Geräten gesendet wird)
Windows-Routing ist ja auch ein Trauerspiel. Die Jungens in Redmond lesen die Standards, verstehen sie nicht, fragen niemand, implementieren irgendwas...
Hat jemand da andere Erfahrungen gemacht, kann man vielleicht in /proc oder /sys etwas einstellen?
Nicht direkt Erfahrung, aber eine kurze Suche in den Man-Pages erzielt folgende Empfehlungen:
man 2 bind man 2 socket man 2 setsockopt man 7 socket (insb. SO_BINDTODEVICE, SO_BROADCAST)
Bei Ping sind das die -b und -I Optionen.
Ganz nebenbei: wieso willst du auf general Broadcast arbeiten? Ich kenne nicht allzu viele Szenarien in denen das sinnvoll ist.
Und Tipp: falls es eine lokale Service-Discovery ist: arbeite doch gleich mit IPv6, da kannst Du Dir einen Link-Local-Multicast (ff02::...) reservieren und kannst viel freier arbeiten als bei IPv4.
Konrad