2012-05-09 13 views
7

Wie sollte ich in dieser Situation wiederherstellen?Wiederherstellung von "Verbindung durch Peer zurückgesetzt" Indy TCP Client

Der Server stürzt ab, daher wurde die Verbindung abnormal geschlossen. Aufrufe an fast alles führen zu "Connection Reset by Peer" Ausnahmen. Ich habe es anscheinend durch das Aufrufen von Disconnect für das TIdTCPClient-Objekt innerhalb des except-Blocks behoben, aber es führt zu einer letzten Ausnahme mit derselben Nachricht (die ich im zweiten try-except-Block abgefangen habe).

Dies ist mit Indy10 und Delphi XE2.

try 
     if not EcomSocket.Connected then EcomSocket.Connect(); 
    except 
     on e: Exception do begin 
     try 
      EcomSocket.Disconnect(); 
     except 
      MessageDlg('Connectivity to the server has been lost.', mtError, [mbOK], 0); 
     end; 
     end; 
    end; 
+0

Haben Sie versucht, in TIdTCPConnection.Disconnect in IdTCPConnection.pas zu debuggen? Möglicherweise wird ein OnDisconnect-Handler ausgeführt und verwendet die Verbindung. Oder die NotifyPeer spielt eine Rolle, siehe auch die Kommentare in der Quelle über verschiedene Szenarien – mjn

+0

Freigeben des Objekts und Erstellen eines neuen neuen wird helfen (aber nicht helfen, den Grund für die Ausnahme zu finden) – mjn

+0

Ich bin nicht so sehr mit warum beschäftigt Ich erhalte eine Ausnahme, wenn ich die Verbindung abbringe. Ich möchte nur wissen, wie ich mich von einer solchen Situation erholen kann. –

Antwort

7

Versuchen Sie folgendes:

try 
    if not EcomSocket.Connected then EcomSocket.Connect(); 
except 
    try 
    EcomSocket.Disconnect(False); 
    except 
    end; 
    if EcomSocket.IOHandler <> nil then EcomSocket.IOHandler.InputBuffer.Clear; 
    MessageDlg('Connectivity to the server has been lost.', mtError, [mbOK], 0); 
end; 
+1

Das Übergeben von "false" an die Disconnect-Methode hat es behoben. Sein Standardverhalten besteht darin, DisconnectNotifyPeer aufzurufen, wodurch die zweite Ausnahme ausgelöst wurde. –

Verwandte Themen