2009-04-24 29 views
3

Ich arbeite mit einem Cluster von ungefähr 40 Knoten, auf denen Debian 4 läuft. Jeder Knoten führt einen Daemon aus, der auf einer Multicast-IP sitzt und wartet.Auswählen einer Schnittstelle beim Multicasting unter Linux

Ich schrieb einige Client-Software, um ein Multicast über das LAN mit einem Clientcomputer auf dem gleichen Switch wie der Cluster zu senden, so dass jeder Knoten im Cluster das Paket empfangen und antworten würde.

Es funktioniert gut, außer wenn ich die Client-Software auf einem Computer mit LAN-und WAN-Schnittstellen ausführen. Wenn eine WAN-Schnittstelle vorhanden ist, funktioniert Multicast nicht. Offensichtlich geht das Multicast falsch über die WAN-Schnittstelle (eth0) und nicht über das LAN (eth1). Also verwende ich die Socket-Option SO_BINDTODEVICE, um zu erzwingen, dass der Multicast-Socket eth1 verwendet, und alles ist gut.

Aber ich dachte, dass die Routing-Tabelle des Kernels feststellen sollte, dass das LAN (eth1) offensichtlich ein kostengünstigeres Ziel für das Multicast ist. Gibt es einen Grund, warum ich den Socket explizit zwingen muss, eth1 zu verwenden? Und gibt es eine Möglichkeit (vielleicht ein ioctl-Anruf), dass die Anwendung automatisch feststellen kann, ob eine bestimmte Schnittstelle ein LAN oder WAN ist?

+0

Nein, der Kernel oder die Sockets-API werden dies nicht automatisch für Sie übernehmen. Wenn Sie etwas Code schreiben könnten, der hilfreich wäre, wenn Leute Sockets anders programmieren. Grundsätzlich besteht ein Ansatz darin, jede Schnittstelle zu untersuchen und festzustellen, ob sie eine nicht im Internet routbare IP-Adresse verwendet. Alternativ können Sie alle Schnittstellen senden. – BobbyShaftoe

Antwort

4

Wenn Sie nicht explizit an eine Schnittstelle binden, glaube ich, dass Linux die Schnittstelle für die Standard-Unicast-Route für das Multicast-Senden verwendet. Also meine Vermutung ist, dass Ihre Standardroute über die WAN-Schnittstelle ist.

Richard Stevens '"Unix Network Programming, Vol. 1", Kapitel 17 (zumindest in der 3. Ausgabe), hat einige gute Informationen und Beispiele zum Aufzählen der Netzwerkschnittstellen.

6

Wenn Sie auf eine Schnittstelle nicht explizit binden, glaube ich Linux die Schnittstelle für den Standard-Unicast Route verwendet für Multicast gesendet wird.

Linux benötigt eine Multicast-Route. Wenn keine existiert, erhalten Sie den Fehler EHOSTUNREACH oder ENETUNREACH. Die LCM project dokumentiert dieses mögliche Problem. Das Routing wird außer Kraft gesetzt, wenn Sie die Socket-Option IP_MULTICAST_IF oder IPV6_MULTICAST_IF verwenden. Sie sollen in der Lage sein, die Schnittstelle über scope-id field in IPv6-Adressen anzugeben, aber nicht alle Plattformen unterstützen sie richtig. Wie Dameiss darauf hinweist, deckt das Buch "Unix Network Programming" von Stevens diese Details ab. Sie können den Großteil des Kapitels über Multicast über Google Bücher kostenlos durchsuchen.

Verwandte Themen