Autor Beitrag
maxk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1696
Erhaltene Danke: 1

Win XP, Debian Lenny
Delphi 6 Personal
BeitragVerfasst: Do 26.04.07 20:25 
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

_________________
Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: 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

_________________
There are 10 types of people - those who understand binary and those who don´t.
maxk Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1696
Erhaltene Danke: 1

Win XP, Debian Lenny
Delphi 6 Personal
BeitragVerfasst: 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])?

_________________
Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mo 30.04.07 12:10 
Moin!

user profile iconmaxk 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: ;)

user profile iconmaxk hat folgendes geschrieben:
Kann man denn das Senden dieser Packete ohne Registrypatch erzwingen

Nein. :|

user profile iconmaxk 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

_________________
There are 10 types of people - those who understand binary and those who don´t.