AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Indy TCP-Anwendung: Wie eine tote Verbindung loswerden?
Thema durchsuchen
Ansicht
Themen-Optionen

Indy TCP-Anwendung: Wie eine tote Verbindung loswerden?

Ein Thema von FoxOne · begonnen am 24. Mai 2007 · letzter Beitrag vom 25. Mai 2007
 
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
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:11 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz