Entwickler-Ecke
Internet / Netzwerk - TClientSocket: Verbindungabbruch nach genau 30 Minuten
maxk - Do 26.04.07 20:25
Titel: TClientSocket: Verbindungabbruch nach genau 30 Minuten
Hallo,
wir schreiben gerade an einem Jabberclienten und sind auf ein sehr merkwürdiges Problem gestoßen: Unser Client verbindet sich via TClientSocket mit dem Jabberserver und dieser schickt an alle anderen raus, dass wir online sind. Nach genau 30 Minuten sendet er, dass wir nicht mehr online sind und die Verbindung bricht zusammen - und hier liegt das Problem, denn:
* die Verbindung existiert auf dem Server nicht mehr (netstat)
* die Verbindung existiert auf unserem Client nicht mehr
* TClientSocket.Active ist weiterhin True
* TClientSocket löst bei besagtem Zeitpunkt keine Ereignisse aus
* auch das Senden auf dem "toten" Socket endet nicht in einem Fehler
Meine Vermutung ist, dass irgendein TCP keepalive Packet nicht gesendet wird, aber darauf hat man doch eigentlich aus Sicht unserer Programmierung keinen Einfluss, oder? Ich bin leider ziemlich ratlos und hoffe, dass uns jemand weiterhelfen kann! Der Fehler ist reproduzierbar, wobei es nervig ist, jedesmal 30 Minuten zu warten :cry:
Der Server läuft übrigens auf Linuxbasis, falls das bei der Problemfindung eine Rolle spielt...
Danke,
maxk
Narses - Do 26.04.07 22:00
Moin!
Bist du hinter einem Router? Das klingt verdächtig nach einem TCP-ForwardTable-Cleanup im Router... ;)
Abhilfe:
a) alle n < 30 min. ein Datenpaket schicken [bevorzugt]
b) die TCP-Keep-Alive Time in der Registry patchen [da sollte man dann schon ganz genau wissen, was man macht :mahn: und abgesehen davon muss man es auch noch auf jedem Rechner machen, auf dem das Programm laufen soll...]
cu
Narses
maxk - Mo 30.04.07 11:38
Danke :-) Das ist zwar nicht genau das, was ich hören wollte, aber es erklärt natürlich das merkwürdige Verhalten...
Was ich aber nicht verstehe ist, warum die Verbindung vom Router beendet wird. Die Peers müssten sich doch gegenseitig Keepalive-Packete senden und damit sollte doch auch der Router merken, dass noch eine Verbindung besteht. Meine einzige Erklärung besteht momentan daran, dass Windows die Packete nicht selbst sendet und unser Server scheinbar keine anfordert. Kann man denn das Senden dieser Packete ohne Registrypatch erzwingen oder ist es wirklich ratsamer NOOP-Befehle zu senden (die ja nicht in jedem Protokoll existieren [in unserem Fall glücklicherweise schon])?
Narses - Mo 30.04.07 12:10
Moin!
maxk hat folgendes geschrieben: |
Was ich aber nicht verstehe ist, warum die Verbindung vom Router beendet wird. Die Peers müssten sich doch gegenseitig Keepalive-Packete senden und damit sollte doch auch der Router merken, dass noch eine Verbindung besteht. Meine einzige Erklärung besteht momentan daran, dass Windows die Packete nicht selbst sendet und unser Server scheinbar keine anfordert. |
AFAIK ist der Default 2h... :? Wenn dein Router also schon nach 30min. kappt, dann würde ich vorschlagen, dort auf 3h zu gehen. :idea: ;)
maxk hat folgendes geschrieben: |
Kann man denn das Senden dieser Packete ohne Registrypatch erzwingen |
Nein. :|
maxk hat folgendes geschrieben: |
oder ist es wirklich ratsamer NOOP-Befehle zu senden (die ja nicht in jedem Protokoll existieren [in unserem Fall glücklicherweise schon])? |
Ja, ich würde genau das machen, um unabhängig von den Umgebungsbedingungen zu werden.
cu
Narses
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!