Einzelnen Beitrag anzeigen

FoxOne

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

Indy TCP-Anwendung: Wie eine tote Verbindung loswerden?

  Alt 24. Mai 2007, 16:59
Hallo!

Da ich mit fehlender Kenntnis übergreifender Zusammenhänge der Indy-TCP Funktionalität zu kämpfen habe, bitte ich in folgener Sache um Hilfe:

Mit meiner Indy9 TCPServer/Client-Anwendung habe ich ein Problem mit Client-seitig unterbrochenen Verbindungen. Wenn ein Client sich für bestimmte Zeit nicht rührt bzw. keine Daten erhält, kann ich davon ausgehen, dass die Verbingung unterbrochen wurde (z.B. WLAN-Ausfall). In diesem Fall hängt der neuerliche Verbindungsaufbau zum Server. Der Server muss neu gestartet werden, dass die Anwendung wieder läuft.
Das passiert bei langsamer Verbindung (GPRS) immer, bei schneller (XDSL) selten.

Mein Ansatz war, den zugehörigen idPeerThread von 'Hand' zu terminieren, weil ich diesem im Verdacht habe, in einem Deadlock zu hängen. Leider nutzt das nichts (Code siehe unten).

Hat jemand eine Idee, wie ich den Server wieder frei bekomme bzw. die 'Altlasten' der toten Verbindung loswerte?

Vielen Dank!




Delphi-Quellcode:

//--- dip : IP-Adresse der Verbindung, deren Thread terminiert werden soll


function TBaseTCPServer.TerminateConnection(dip: string): boolean;
var i : integer;
    List : TList;
begin

  result:=true;
  if not idTCPServer.Active then Exit;

  List := idTCPServer.Threads.LockList;
  

  i:=List.count-1;
  while (i>=0) and
      (AnsiCompareStr(TidPeerThread(List.Items[i]).Connection.Socket.Binding.PeerIP,dip)<>0) do
    dec(i);

  if i>=0 then
  begin
    try
      //--- Sicherheitshalber disconnecte ich alles, was mit dem Thread in Zusammmenhang steht
      TidPeerThread(List.Items[i]).Connection.Disconnect;
      TidPeerThread(List.Items[i]).Connection.DisconnectSocket;
    finally
        TidPeerThread;(List.Items[i]).Terminate;
    end;
  end;

  idTCPServer.Threads.UnlockList;
  list.Clear;
  
end;
  Mit Zitat antworten Zitat