Im Falle der INDYs relativiert sich das aber.
Wir kennen alle die Excpetion "Connection closed gracefully". Ja, ein Ausnahme-bedingung und KEINE Fehlermeldung wie oft irrtümlich vermutet. Eben exakt das was
EXCEPTION (auch wenn die
DP für dieses Wort nur die halbe Wahrheit als Hint anzeigt
) auch bedeutet !
Du setzt den Timeout der TcpClient Komponente auf einen hohen Wert, zb. eben auch INFINITE. Dann rufts du einfach Readln() auf. Intern wird
INDY mit Events auf neue Daten warten (wichtig ist das du auch die TcpClient Thread Methode benutzt, logisch). Dein Terminierungs Event entfällt vollständig !!
Denn wenn du deinen Client Thread extern beenden möchtest dann wird
INDY intern den Socket asynchron sofot schließen. Das führt dann innerhalb deines .ReadLn() und somit innerhalb deiner Threadbasierten Schleife zu einer
Exception, eg. Ausnahme -> Connection closed gracefully
Deine Aufgabe ist es also nur noch in deine Client Thread Methode das .ReadLn() in einem try except Block zu kapseln. Darin wirst du dann auf die
Exception EConnectionClosedGracefully und ETimeout (oä.) speziell reagieren. Bei EConectionClosedGracefully terminierst du deine Threadschleife OHNE den Socket manuell zu schließen (er ist ja schon zu).
Ab diesem Moment wartet dein Thread in ReadLn() per Events, das kann ich für
INDY garantieren.
Sooo, fehlt nur noch die Konfiguration des Betriebsystemes. Denn zb. in Win2k wartet das
OS viele Stunden bevor es eine Socket Verbindung überprüft ob sie noch vorhanden (lebendig) ist. Sollte also der Server hart die Connection trennen so bekommt der Client dies auf solchen Rechnern erst nach vielen Stunden mit. Auf dieses Problem stießen wir selber erst mit dem Firebird Server. Schau mal im MSN nach dort steht beschrieben wie man in der Registry dieses Keepalive oä. einstellen kann.
Gruß Hagen