Zitat:
Anders ist es allerdings, wenn der PDA beim Beenden des Servers nicht mehr erreichbar ist. Dann versucht der Server die Verbindung zu beenden, bleibt dabei aber hängen.
klingen als ob nach dem obigen "Writeln" noch etwas vom Server gemacht wird, zum Beispiel auf die Antwort des Clients auf das 'CLOSE_REQUEST@' zu warten. Und das kann natürlich nicht mehr erfolgreich sein wenn der Client nicht da ist. In diesem Fall sollte der Server die dann auftretende
Exception (vermutlich ReadTimeOut) eventuell nicht mehr behandeln und
Indy automatisch den Thread beenden lassen, wenn ich mich richtig erinnere.
Der ReadTimeOut ist gesetzt (300 sek. habe aber den Server eine viertel Stunde in Ruhe gelassen, er hing immer noch
Die Clients schließen auf die Aufforderung nur die Sockets. Es wird nichts gesendet.
Exception wird ja auch keine geworfen. Zu keinem Zeitpunkt.
Beim IOHandler.Read kann ein TimeOut direkt als Parameter angegeben werden. Der Default ist relativ lange, was wie ein Hänger aussehen kann.
(Send-Timeouts sind plattformspezifisch, nicht als Parameter oder Properties, konfigurierbar und hier anscheinend nicht das Problem)
Hope this helps,
Einzig allein in der OnExecute-Routine wird der Inputbuffer ausgelesen
Delphi-Quellcode:
if AContext.Connection.IOHandler.InputBufferIsEmpty then
begin
SleepEx(10, True);
Exit;
end;
oAnswer := TStringList.Create();
try
bTest := True;
cMess := Trim(AContext.Connection.IOHandler.InputBufferAsString());
//cMess := Trim(AContext.Connection.IOHandler.ReadLn());
if cMess = '' then
begin
Exit;
end;
...
es wird also explizit vorher nachgesehen, ob etwas im Puffer steht. Auch kommt er beim Beenden nicht an diese Stelle. Kann somit leider ausgeschlossen werden