Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
TCP-Keepalive und Erkennen des Disconnect
Mexxchen
myCSharp.de - Member



Dabei seit:
Beiträge: 70

Themenstarter:

TCP-Keepalive und Erkennen des Disconnect

beantworten | zitieren | melden

Hallo zusammen,

ich habe eine TCP-Verbindung von einer Applikation zu einem externen Gerät. Dieses sendet mir Daten, welche ich verarbeite und in eine Datei schreibe. Nun möchte ich einen Verbindungsabbruch des Sockets erkennen.
Als eine Möglichkeit nutze ich das Beispiel von Microsoft wie auch in diesem Thread

Nun wollte ich die Möglichkeit des Keepalive probieren. Dazu habe ich in einem Beipiel gefunden, dass man das per Socket.IOControl machen kann TCP keepAlive settings problem
Per Wireshark sehe ich, dass die Packete gesendet werden. Wie erkenne ich jetzt bei mir in der Appliaktion, dass das Keepalive fehlgeschlagen ist?
private Nachricht | Beiträge des Benutzers
weismat
myCSharp.de - Member



Dabei seit:
Beiträge: 872
Herkunft: Frankfurt am Main

beantworten | zitieren | melden

Welche Klasse benutzt Du denn genau?
Normalerweise solltest Du anhand connected Eigenschaft des Sockets oder anhand der IOException beim Read/Write sehen, dass Du abgehangen bist.
Wuerde an Deiner Stelle aber immer fals moeglich selber ping/keepalive implementieren, da das Protokoll an solchen Stellen intransparent ist.
private Nachricht | Beiträge des Benutzers
Mexxchen
myCSharp.de - Member



Dabei seit:
Beiträge: 70

Themenstarter:

beantworten | zitieren | melden

Hallo weismat,

ich nutze die Socket-Klasse und verbinde mich per Connect mit dem Gerät (Server), oder was meinst Du genau? Im Prinzip bin ich nur 'hörend' verbunden. D. h. ich empfange in einem Timer (sekündlich) Daten ...oder auch nicht :-)

Ich hatte bisher die Möglichkeit genutzt, in der ich zyklisch ein leeres Byte.Array sende und anhand der SocketException erkenne, ob die Verbindung ok ist.

Nun wurde der Wunsch geäußert, dass mit dem Standard-Keepalive zu versuchen. Ich kann es ja auch aktivieren und sehe auch die Packete in Wireshark, aber ich bekomme es leider nicht in meiner Anwendung mit.
private Nachricht | Beiträge des Benutzers
mogel
myCSharp.de - Member

Avatar #avatar-3347.jpg


Dabei seit:
Beiträge: 156

beantworten | zitieren | melden

Mo in,

Der Keep-Alive Timeout ist afaik auf einen sinnlos hohen Wert gesetzt. Musst mal in den Tiefen der RFC suchen.

Wenn garantiert ist das du immer im Sekundentakt etwas bekommst, dann reicht es wenn du nach drei Sekunden nichts die Verbindung für gescheitert erklärst. Ich mach das im Moment mit meiner RS485 Verbindung genau so.

Alternativ selber Ping-Pong spielen und den Keep-Alive simulieren.


Hand, mogel
private Nachricht | Beiträge des Benutzers
Mexxchen
myCSharp.de - Member



Dabei seit:
Beiträge: 70

Themenstarter:

beantworten | zitieren | melden

Hallo, ich kann pro Sekunde etwas bekommen...oder auch nicht. Das heißt aber nicht, dass die Verbindung gekappt ist.
Beispiel: Verbindung mit Gerät wird aufgebaut und Timer startet (1/s). Am Gerät starte ich eine Ausgabe z.B. aus dem internen Speicher oder durch Start eines Gerätezyklus mit gleichzeitiger Ausgabe. Wenn alles übertragen ist, geht's in die Mittagspause und es passiert 30min nichts. Die Verbindung ist trotzdem ok...der Timer ließt vom Socket 0 Bytes etc.
Ich könnte selber z.B. einen String alle 5 min senden und die Antwort abwarten. Dazu muss in der Geräte-SW das Antwortverhalten implementiert werden...

Der Standard-Keep-Alive Timeout ist glaub ich 2h o.ä.
private Nachricht | Beiträge des Benutzers
Mallett
myCSharp.de - Member



Dabei seit:
Beiträge: 171

beantworten | zitieren | melden

Wenn Du die Möglichkeit hast, die Gerätesoftware zu manipulieren, sende einfach in regelmäßigen Zeitabständen vom Gerät aus ein definiertes Signal zu deiner Windows-Anwendung. Wenn das Signal ausbleibt kannst Du auf Seite Deiner Applikation schließen, dass das Gerät weg ist.

Ich hab sowas vor einiger Zeit auch mal gemacht, nachdem ich ewig nach einer API-internen Lösung gesucht habe und nicht fündig geworden bin.
private Nachricht | Beiträge des Benutzers
Mexxchen
myCSharp.de - Member



Dabei seit:
Beiträge: 70

Themenstarter:

beantworten | zitieren | melden

Hallo, danke für die Hinweise.
private Nachricht | Beiträge des Benutzers
Programmierhans
myCSharp.de - Experte

Avatar #avatar-1651.gif


Dabei seit:
Beiträge: 4.221
Herkunft: Zentralschweiz

beantworten | zitieren | melden

Schau Dir das noch an...

(Socket) Prüfen ob Client/Server noch online sind

Gruss
Programmierhans
Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...
private Nachricht | Beiträge des Benutzers