Einzelnen Beitrag anzeigen

FoxOne

Registriert seit: 24. Mai 2007
Ort: Wien
7 Beiträge
 
#6

Re: Indy TCP-Anwendung: Wie eine tote Verbindung loswerden?

  Alt 25. Mai 2007, 16:52
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?
  Mit Zitat antworten Zitat