Ich verwende Multicast-UDP zwischen Hosts mit mehreren Netzwerkschnittstellen. Ich verwende boost :: asio und bin verwirrt über die 2 Operationen, die Empfänger ausführen müssen: Binden, dann Join-Gruppe.
Warum müssen Sie während der Bindung die lokale Adresse einer Schnittstelle angeben, wenn Sie dies mit jeder Multicast-Gruppe tun, der Sie beitreten?
Die Schwesterfrage betrifft den Multicast-Port: Da Sie während des Sendens an eine Multicast-Adresse und einen Multicast-Port senden, geben Sie beim Abonnieren einer Multicast-Gruppe nur die Adresse an, nicht den Port - den Port, der im verwirrenden Aufruf an angegeben wird binden.
Hinweis: Die "Join-Gruppe" ist ein Wrapper-Over setsockopt(IP_ADD_MEMBERSHIP)
, der, wie dokumentiert, mehrmals am selben Socket aufgerufen werden kann, um verschiedene Gruppen (über verschiedene Netzwerke?) Zu abonnieren. Es wäre daher absolut sinnvoll, den Bindungsaufruf zu beenden und den Port jedes Mal anzugeben, wenn ich eine Gruppe abonniere.
Soweit ich weiß, funktioniert es sehr gut, immer an "0.0.0.0" zu binden und die Schnittstellenadresse beim Beitritt zur Gruppe anzugeben. Verwirrt.
always binding to "0.0.0.0" and specifying the interface address when joining the group, works very well
falsch istDie "Bind" -Operation lautet im Wesentlichen: "Verwenden Sie diesen lokalen UDP-Port zum Senden und Empfangen von Daten. Mit anderen Worten, dieser UDP-Port wird ausschließlich für Ihre Anwendung verwendet. (Gleiches gilt für TCP-Sockets.)
Wenn Sie an "0.0.0.0" (
INADDR_ANY
) binden , weisen Sie die TCP / IP-Schicht grundsätzlich an, alle verfügbaren Adapter zum Abhören zu verwenden und den besten Adapter zum Senden auszuwählen. Dies ist Standard für die meisten Socket-Codes. Das einzige Mal, dass Sie 0 für die IP-Adresse nicht angeben würden, ist, wenn Sie auf einem bestimmten Netzwerkadapter senden / empfangen möchten.Wenn Sie während der Bindung einen Portwert von 0 angeben, weist das Betriebssystem diesem Socket eine zufällig verfügbare Portnummer zu. Ich würde also erwarten, dass Sie für UDP-Multicast an einer bestimmten Portnummer, an die Multicast-Verkehr gesendet werden soll, an INADDR_ANY binden.
Die Operation "Join Multicast Group" (
IP_ADD_MEMBERSHIP
) wird benötigt, da Ihr Netzwerkadapter grundsätzlich nicht nur auf Ethernet-Frames wartet, bei denen die Ziel-MAC-Adresse Ihre eigene ist, sondern auch darauf, dass der Ethernet-Adapter ( NIC ) auf IP-Multicast-Verkehr wartet gut für die entsprechende Multicast-Ethernet-Adresse. Jede Multicast-IP wird einer Multicast-Ethernet-Adresse zugeordnet. Wenn Sie einen Socket zum Senden an eine bestimmte Multicast-IP verwenden, wird die Ziel-MAC-Adresse im Ethernet-Frame auf die entsprechende Multicast-MAC-Adresse für die Multicast-IP festgelegt. Wenn Sie einer Multicast-Gruppe beitreten, konfigurieren Sie die Netzwerkkarte so, dass sie auf Datenverkehr wartet, der an dieselbe MAC-Adresse gesendet wird (zusätzlich zu ihrer eigenen).Ohne die Hardwareunterstützung wäre Multicast nicht effizienter als reine Broadcast-IP-Nachrichten. Der Join-Vorgang weist Ihren Router / Ihr Gateway außerdem an, Multicast-Verkehr von anderen Netzwerken weiterzuleiten. (Erinnert sich jemand an MBONE?)
Wenn Sie einer Multicast-Gruppe beitreten, wird der gesamte Multicast-Verkehr für alle Ports an dieser IP-Adresse von der Netzwerkkarte empfangen. Nur der für Ihren gebundenen Überwachungsport bestimmte Datenverkehr wird über den TCP / IP-Stapel an Ihre App weitergeleitet. In Bezug darauf, warum Ports während eines Multicast-Abonnements angegeben werden - weil Multicast-IP genau das ist - nur IP. "Ports" sind eine Eigenschaft der oberen Protokolle (UDP und TCP).
Sie können mehr darüber lesen, wie Multicast-IP-Adressen Multicast-Ethernet-Adressen an verschiedenen Standorten zugeordnet werden. Der Wikipedia-Artikel ist so gut wie es nur geht:
quelle
bind(interfAddr, port)
tut. Es werden nur Verbindungen von diesem bestimmten Netzwerk akzeptiert. Ich habe überprüft, ob dies korrekt ist. Bei UDP-Sockets scheint die Bindungsadresse mit dem zweiten Argument von IP_ADD_MEMBERSHIP redundant zu sein. Nicht gerade redundant, da die Einstellung nicht zu funktionieren scheint - nur 0.0.0.0 funktioniert.read()
kein Ergebnis erzielt wird (bleibt für immer hängen).Korrektur für Was bedeutet es, einen Multicast-Socket (udp) zu binden? solange es teilweise beim folgenden Zitat zutrifft:
Es gibt eine Ausnahme. Wenn die Option angewendet wird, können mehrere Anwendungen denselben Port zum Abhören gemeinsam nutzen (normalerweise hat er einen praktischen Wert für Multicast-Datagramme)
SO_REUSEADDR
. Zum BeispielWenn mehrere Prozesse eine solche "Wiederverwendungsbindung" durchgeführt haben, wird jedes an diesem gemeinsam genutzten Port empfangene UDP-Datagramm an jeden der Prozesse übermittelt (wodurch eine natürliche Verbindung mit Multicast-Verkehr hergestellt wird).
Hier sind weitere Details dazu, was in einigen Fällen passiert:
Der Versuch einer Bindung ("exklusiv" oder "Wiederverwendung") an den freien Port ist erfolgreich
Der Versuch einer "exklusiven Bindung" schlägt fehl, wenn der Port bereits "wiederverwendungsgebunden" ist.
Der Versuch, die Bindung "wiederzuverwenden", schlägt fehl, wenn ein Prozess die "exklusive Bindung" beibehält.
quelle
Es ist auch sehr wichtig, einen SENDING-Multicast-Socket von einem RECEIVING-Multicast-Socket zu unterscheiden.
Ich stimme allen obigen Antworten bezüglich des EMPFANGS von Multicast-Sockets zu. Das OP stellte fest, dass das Binden eines RECEIVING-Sockets an eine Schnittstelle nicht hilfreich war. Es ist jedoch erforderlich, einen Multicast-SENDING-Socket an eine Schnittstelle zu binden.
Für einen SENDING-Multicast-Socket auf einem Multi-Homed-Server ist es sehr wichtig, für jede Schnittstelle, an die Sie senden möchten, einen separaten Socket zu erstellen. Für jede Schnittstelle sollte ein gebundener SENDING-Socket erstellt werden.
Ohne dieses Update wird beim Multicast-Senden zeitweise sendto () errno 'Keine Route zum Host' angezeigt. Wenn jemand Aufschluss darüber geben kann, warum das Trennen eines DHCP-Gateways dazu führt, dass Mac OS X Multicast-SENDING-Sockets verwirrt werden, würde ich es gerne hören.
quelle