Client Socket erkennt Verbindungsabbruch nicht

Ich habe mehrere ESPs, zu denen ich von IPS aus eine Verbindung mittels Client Socket herstelle.
Nun habe ich durch Zufall festgestellt, dass IPS einen Verbindungsabbruch nicht erkennt. Wenn ich die ESPs vom Strom trenne, bleiben die I/Os einfach ganz normal offen. Kein rotes Rufzeichen, keine Statusänderung, keine Fehlermeldungen, nichts. Auch nicht, wenn ich längere Zeit warte.

Wenn ich die ESPs dann wieder online nehme, werden keine Daten mehr ausgetauscht, da die Instanz halt gar nicht mitbekommen hat, dass die Verbindung weg ist. Um den Datenaustausch wieder zu starten, muss ich die I/Os einmal deaktivieren und wieder aktivieren.

Wieso erkennt der Client Socket nicht, dass die Verbindung weg ist? Das ist in sofern blöd, dass ich im Falle eines Stromausfalls der ESPs nicht mitbekomme, dass kein Datenaustausch mehr stattfindet. Und da sich der Status der I/Os nicht ändert, kann ich auch nicht via Event-Handler gegensteuern. Meine einzige Chance ist, den Datenaustausch indirekt zu überwachen, indem ich prüfe, ob die Variablen, die durch die Client Sockets gespeist werden, seit einer gewissen Zeit keine Änderung mehr erfahren haben. Dann kann ich indirekt darauf schließen, dass mit dem I/O scheinbar was nicht stimmt und versuchen, die I/Os zu deaktivieren und anschließend wieder zu aktivieren. Wirklich toll ist das aber nicht, da der Workaround letzten Endes auch davon abhängt, wie oft unter normalen Bedingungen Daten ausgetauscht werden. Wenn es keinen festen Zeitraum gibt, indem ich sicher eine Variablenänderung erwarten kann, kann ich eigentlich nur raten, ob der I/O dicht ist oder einfach noch keine neuen Daten empfangen wurden.

Kann ich irgendwie beeinflussen, dass IPS doch erkennt, wenn bei einem Client Socket die Verbindung wegbricht? Da es sich um TCP handelt und die Verbindung somit stateful ist, muss ich das doch checken können.

Ja, indem du etwas zum ESP sendest (egal was).
Dann erkennt der Clientsocket die halbseitig gestorbene Verbindung.
Michael

Also einfach regelmäßig per CSCK_SendText() irgendwas als Keepalive schicken und wenn die Verbindung weg ist, geht der I/O anschließend auf Fehler?

Cool, danke für den Tipp! Manchmal kann es so einfach sein. :slight_smile:
Wobei man ein (optionales) Keepalive natürlich auch direkt mit in die I/Os hätte einbauen können. :wink:

Der Trick hier wäre, ein ‚leeres‘ TCP Packet zu senden. Also eins wo die enthalten Nutzdaten die Länge 0 haben.
Aber ob das mit CSCK_SendText() funktioniert, habe ich nie getestet.
Von sich aus macht der Clientsocket das ja scheinbar nicht.
Michael

Ich werde es damit mal ausprobieren und berichte, ob es klappt. Danke dir!

Funktioniert das im umgekehrten Fall auch? Immer wenn ich IPS neu starte (nach Aktualisierungen oder Rückspielen von Snapshots) bleibt das Velux Client Socket gestört. Bisher muss ich dann immer das Velux Interface neu starten, damit es wieder funzt.

Nein. Weil dann müsste das KLF den Abbruch erkennen. Was es aber, wenn du den Dienst beendest, erkennen sollte.
Stürzt dagegen Symcon oder der Host ab, oder ziehst Symcon den Netzwerkstecker, dann kann das KLF das ebensowenig erkennen wie im obigen Fall Symcon.
Michael

1 „Gefällt mir“

Ok, dann hoffe ich, dass mir hier jemand helfen kann. :upside_down_face:

Ich schicke jetzt auf allen Client Sockets regelmäßig eine Nachricht per CSCK_SendText() raus. Das funktioniert perfekt. Die I/Os gehen bei Verbindungsabbruch sofort auf Fehler und die regulären Fehlerbehandlunsmechanismen greifen.

Danke noch mal für den Tipp!