Laden...

TCP-Keepalive und Erkennen des Disconnect

Erstellt von Mexxchen vor 11 Jahren Letzter Beitrag vor 10 Jahren 3.380 Views
M
Mexxchen Themenstarter:in
70 Beiträge seit 2011
vor 11 Jahren
TCP-Keepalive und Erkennen des Disconnect

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?

W
872 Beiträge seit 2005
vor 11 Jahren

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.

M
Mexxchen Themenstarter:in
70 Beiträge seit 2011
vor 11 Jahren

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.

156 Beiträge seit 2010
vor 11 Jahren

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

M
Mexxchen Themenstarter:in
70 Beiträge seit 2011
vor 10 Jahren

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.ä.

M
171 Beiträge seit 2012
vor 10 Jahren

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.

M
Mexxchen Themenstarter:in
70 Beiträge seit 2011
vor 10 Jahren

Hallo, danke für die Hinweise.

4.221 Beiträge seit 2005
vor 10 Jahren

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...