Forum: PC-Programmierung Asynchrone Mechanismus der Ping-Klasse C#


von Entwickler (Gast)


Lesenswert?

Guten Morgen,

für eine spezielle Anwendung verwende ich in C# die asynchrone 
Mechanismus von der Ping-Klasse. Sobald ich kurzzeitig die 
Ethernetverbindung eines Teilnehmer deaktiviere (Netzwerkkabel aus 
Buchse gezogen) und im Anschluss wieder aktiviere, erhalte ich zwei bis 
drei TimeOuts. In einem zyklischen Timer mit 1 Sekunde werden andauernd 
Pings an die entsprechenden Teilnehmer gesendet. In der Ping Callback 
Methoden wird dann auf die entsprechenden Ping Echos bzw. TimeOuts 
reagiert. Den TimeOut habe ich bei mir auf 2 Sekunden eingestellt. Ist 
dieses Verhalten normal oder müsste ich bei der Implementierung noch was 
beachten?

Siehe asynchrone Verwendung der Ping-Klasse:
https://msdn.microsoft.com/de-de/library/system.net.networkinformation.ping(v=vs.110).aspx

von Stephan (Gast)


Lesenswert?

wenn das nur zum Testen und spielen ist, ist es ok.
Sollte doch mehr dahinter stecken, dann Überlege noch mal!

>Netzwerkkabel aus Buchse gezogen
Deine Timeouts sind doch keine Timeouts der Ping-Funktion.
(nicht alle)

Ich kenne das .Net und C# nicht, aber müsstest du nicht den 
Netzwerkstatus überwachen(Link Lost), bevor du eine Message auf den Bus 
legst?
1) es sollte eine Error-Meldung von der Sende-Funktion kommen, da kein 
Link da ist, kann nichts gesendet werden!
2) wenn kein Link, dann sollte dein Programm auch nichts senden! (-> 
kein Timeout)

Also: Prüfe dein Netz, wenn kein Link - dann nichts senden und in ruhe 
abwarten und Tee trinken(dein Programm in den Safe-State bringen). Ist 
das Netz da(Link), dann feuere deine Pings los, aber mit bedacht!

Den Trick mit den Kabel ziehen, hab ich auch schon bei unseren 
Praktikanten gemacht und die haben die Fehler auch unterschlagen wie du. 
lol
Einer hatte sogar eine Endless-Loop aus versehen gebaut und mit dem 
async das ganze Netz geflutet. Wie viele Sends machst du, bis du einen 
Fehler feststellst?

von Entwickler (Gast)


Lesenswert?

Sobald ich das Netzwerkkabel vom Gerät ziehe, dann wird in der 
PingCompletedCallback Methode kein Fehler detektiert. Es wird ein 
TimeOut gemeldet aber kein Error. Wie kann man im Asynchrone Mechanismus 
eine Fehlerhaft Netzwerkverbindung korrekt detektieren?

von Stephan (Gast)


Lesenswert?

was sagt:
- AsyncCompletedEventArgs.Error-Eigenschaft
- NetworkInterface.OperationalStatus-Eigenschaft
- NetworkAvailabilityEventArgs
>Stellt Daten für das NetworkAvailabilityChanged-Ereignis bereit.
- NetworkChange
>Ermöglicht Anwendungen das Empfangen einer Benachrichtigung, wenn sich die
>IP (Internet Protocol)-Adresse einer Netzwerkschnittstelle, auch als
>Netzwerkkarte oder -adapter bezeichnet, ändert.

mehr kann ich dazu auch nicht sagen. Bin kein .Net Entwickler nur C++.

von Stephan (Gast)


Lesenswert?

Noch eine Frage: Läuft der Timeout wirklich ab, oder wird abgebrochen?

von Entwickler (Gast)


Lesenswert?

Sobald ich das Netzwerkkabel vom Zielgerät entferne, wird immer in die 
Callback PingCompletedCallback Methode gesprungen. In einem Timer wird 
zyklisch ein Ping gesendet.

Wie kann ich festellen, ob der Tiemout abläuft?

von Stephan (Gast)


Lesenswert?

Entwickler schrieb:
> Sobald ich das Netzwerkkabel vom Zielgerät entferne, wird immer in die
> Callback PingCompletedCallback Methode gesprungen.

direkt danach? das hört sich doch gut an, er will dir was sagen! :-)
Prüfe den Status(???) PingCompletedEventArgs ???

von Entwickler (Gast)


Lesenswert?

In PingCompletedEventArgs wird entweder ein Timeout oder Success 
vermerkt aber kein Error oder Cancelled.

von Entwickler (Gast)


Lesenswert?

Jede Sekunde wird in einem Timer ein Ping durch die Funktion SendAsync 
gesendet. Der Timeout habe ich auf 2 Sekunden eingestellt.

Was müsste ich tun, sobald ein Timeout in der Callback Methode 
aufschlägt?
Mit sicherheit liegt es an der Implementierung.

von Entwickler (Gast)


Lesenswert?

Hab vergessen mitzuteilen, dass nur am Zielgerät das Netzwerkkabel nicht 
angeschlossen ist. Am Client PC steckt das Netzwerkkabel.

von Narfie (Gast)


Lesenswert?

Vll. beschreibst du mal was du machen möchtest, evtl. kann dir ja dann 
jemand besser helfen. Oder ist der Sinn deiner "speziellen Anwendung" zu 
prüfen ob der andere Rechner noch auf Pings reagiert?

von Stephan (Gast)


Lesenswert?

@Entwickler
da kann ich dir auch nicht weiterhelfen, sorry.

Bei uns wird das folgendermaßen gemacht:
Der Send darf nur bei einem Link oder einem Loopback ausgeführt werden 
und Softwareseitig ist eine Anfrage an einem Device mit max 3 Pings 
gleichzeitig erlaubt. (soll den Trafic begrenzen)
Bei einem Empfangshändler wird bei einem schlechten 
Empfang(Timeout/Error), der Status des Netzwerks geprüft und entsprechen 
behandelt.
Der Neustart darf erst wieder bei guten Netzwerk-Status erfolgen.


Kannst du sagen was du machen möchtest?
Wie gesagt, für die Schule sollte doch deine Version reichen, die Lehrer 
haben meist eh keine Ahnung.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.