Vielen Dank für die Antwort!
Habe inzwischen weiter herumprobiert und kann bestätigen, dass der Socket den Thread ordentlich wegputzt, wenn eine bestimmte Zeit verstrichten ist (irgendein Timeout von ca. 30s, ich weiß nicht, wie bzw. wo der zu setzen ist). Es wird dann die bereits erwähnte
Exception 'Connection reset by peer' geworfen.
Bei meinen Internetrecherchen bin ich auf den Tip gestoßen, diese
Exception nocheinmal anzustoßen, weil sie
Indy intern noch verwertet, also:
Delphi-Quellcode:
uses ....,IdException;
procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
begin
try
//--- Server Arbeit hier
//..
//..
except
on e: EIdSocketError
do
begin //-- Indy exception
ErrorOut('
Socket Exception in OnExecute: ' + e.
message);
Raise;
//--- wichtig!
end;
on e:
exception do
begin //-- andere exception
ErrorOut('
Exception in MyOnReceive: ' + e.
message);
Raise;
//--- wichtig?
end;
end;
end;
Dies hat soweit geholfen, dass die
Exception nun nur mehr einmal kommt. Wenn ich mir vor dem Timeout und danach die Threadliste anschaue, dann ist nachher der 'tote' Thread tatsächlich weg.
Beim erneuten starten des Clients wird dann die Verbindung soweit aufgebaut, dass ein neuer TidPeerThread in der Threadliste ist, aber leider wird nun die OnExecute-Prozedur des Servers nicht mehr aufgerufen. Somit hängt Client-Server-Verbindung, aber eben nur in etwa 50% der Fälle bei langsamer Verbindung. Der Rest der Server-Applikation (Datenerfassung etc.) läuft ungestört weiter. Beim Beenden des Servers kommt dann wenig überraschen die
Exception 'Terminate Thread Timeout'.
Habe inzwischen auch einen OnListenException-Handler implementiert, der springt aber nicht an.
Ich bin also weiterhin ratlos. Wie kann ich den Server wieder freibekommen?