3 Stimmen

C# UDP-Multicast-Sockets - Behandlung von Verbindungsfehlern

Ich arbeite an einer UDP-Multicast-Bibliothek und habe eine Frage zum richtigen Umgang mit Verbindungsfehlern, nicht angeschlossenen/eingesteckten NIC-Kabeln usw.

In meinem Test habe ich die folgenden Einstellungen vorgenommen:

  • 2 Server sA und sB
  • sA sendet UDP-Multicast-Daten und sB empfängt Multicast-Daten
  • Server sind über einen Layer-2-Gigabit-Switch von Cisco verbunden

Wenn ich beispielsweise der Multicast-Gruppe auf sB beitrete, beginne ich, auf diesem Socket Daten aus den Multicast-Paketen von sA zu empfangen.

Wenn ich nun die Netzwerkkarte, an die der Multicast-Empfänger sB gebunden ist, deaktiviere/abstecke, kann ich nicht Ich erhalte keine Fehler auf Socket-Ebene (z. B. in Socket.ReceiveAsync), was wohl zu erwarten ist, da UDP verbindungslos ist, aber ich hatte gehofft, dass ich eine Art von Benachrichtigung/Ausnahme erhalten würde, wenn die IP, an die der Multicast-Empfänger gebunden ist, nicht mehr verfügbar ist.

Wie auch immer, wenn ich die Netzwerkkarte wieder aktiviere, empfange ich keine Daten mehr, obwohl der Absender immer noch an dieselbe Multicast-Gruppe sendet. Ich hatte gehofft, dass der Kernel den Wiedereintritt in die Multicast-Gruppe nach einem Hardware-Link-Ausfall tatsächlich handhaben würde, aber so wie es aussieht, tut er das nicht. Da ich aber auch keine Fehler auf Socket-Ebene erhalte, weiß ich nicht wirklich, wie ich einen Verbindungsausfall bei einem Multicast-Empfänger erkennen kann. Gibt es bestimmte Socket-Optionen, die gesetzt werden müssen, damit der Kernel einer Multicast-Gruppe wieder beitreten kann? Die einzige Option, die mir bisher eingefallen ist, ist, auf System.Net.NetworkInformation.NetworkChange.NetworkAddressChanged-Ereignisse zu warten und zu versuchen, eine neue Verbindung herzustellen, wenn ich eine Benachrichtigung erhalte, dass die lokale IP, an die ich mich binden muss, wieder verfügbar ist. Wie gehen andere Multicast-Anwendungen mit diesem Szenario um?

Danke,

Tom

3voto

user207331 Punkte 69

Ich empfehle Ihnen, die folgende Veranstaltung zu abonnieren: System.Net.NetworkInformation.NetworkChange.NetworkAvailabilityChanged

Für den Fall, dass das verfügbare Netzwerk offline ist, sollten Sie Ihren Event-Handler so gestalten, dass er den Empfänger ordnungsgemäß zurücksetzt. Umgekehrt binden Sie Ihren Empfänger neu, wenn die Netzverfügbarkeit online ist.

0voto

Andrew Keith Punkte 7362

Ich kann nicht ins Detail gehen, weil es ein Firmengeheimnis ist, wie meine Firmenprotokolle funktionieren, aber programmieren Sie in einem Herzschlag periodisch zwischen Ihrem Server und Ihren Kunden. Ihre Software kann dann intern feststellen, wann der letzte Herzschlag eingetroffen ist, und daraus ableiten, ob Sie eine Art Netzwerk-/Hardwarefehler erlitten haben.

Es gibt viele Optionen, mit denen man herumspielen kann, um zu versuchen, einen aufgetretenen Fehler zu erkennen, einschließlich der Überprüfung von NetworkAddressChanged, aber es ist sicherer, den Heartbeat zu implementieren, weil es eine generische Lösung ist, die einfach zu implementieren ist und fast alle Fälle abdecken sollte.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X