2012-05-09 9 views
7

Jak powinienem być wracając do zdrowia w tej sytuacji?odzyskiwanie z "Connection Reset Peer" Indy TCP Client

Serwer ulega awarii, a więc połączenie zostało nieprawidłowo zamknięte. Połączenia z niemal wszystkim powodują wyjątki "Połączenie resetuj według partnera". Wydaje się, że naprawiłem to, wywołując Disconnect na obiekcie TIdTCPClient wewnątrz bloku except, ale powoduje to jeden końcowy wyjątek z tą samą wiadomością (którą złapałem w drugim bloku try-except).

Jest to z Indy10 i 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

Próbowałaś do debugowania do TIdTCPConnection.Disconnect w IdTCPConnection.pas? Być może program obsługi OnDisconnect jest wykonywany i używa połączenia. Lub NotifyPeer odgrywa rolę, zobacz także komentarze w źródle dotyczące różnych scenariuszy. – mjn

+0

Uwolnienie obiektu i utworzenie nowego, pomoże (ale nie pomoże znaleźć przyczyny wyjątku). – mjn

+0

Nie przejmuję się tym, dlaczego Otrzymuję wyjątek podczas wywoływania rozłączenia. Chcę tylko wiedzieć, jak prawidłowo wyleczyć się z takiej sytuacji. –

Odpowiedz

7

Spróbuj tego:

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

Przekazanie "false" do metody Disconnect to naprawiło. Jego domyślnym działaniem jest wywoływanie DisconnectNotifyPeer, które wyzwoliło drugi wyjątek. –

Powiązane problemy