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;