2012-05-09 31 views
7

¿Cómo debo estar recuperándome en esta situación?recuperándose de "Connection Reset By Peer" Indy TCP Client

El servidor falla, por lo que la conexión ha sido anormalmente cerrada. Las llamadas a casi todo resultan en excepciones de "Restablecimiento de conexión por pares". Parece que lo solucioné llamando a Desconectar en el objeto TIdTCPClient dentro del bloque except, pero da como resultado una excepción final con el mismo mensaje (que he capturado en el segundo bloque try-except).

Esto es con Indy10 y 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

¿Se intenta depurar en TIdTCPConnection.Disconnect en IdTCPConnection.pas? Tal vez se ejecuta un controlador OnDisconnect y utiliza la conexión. O el NotifyPeer juega un rol, vea también los comentarios en la fuente sobre diferentes escenarios – mjn

+0

Liberar el objeto y crear uno nuevo ayudará (pero no ayudará a encontrar el motivo de la excepción) – mjn

+0

No me preocupa tanto el por qué Recibo una excepción cuando llamo desconectarme. Solo quiero saber cómo recuperarse adecuadamente de una situación como esta. –

Respuesta

7

Prueba esto:

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

Al pasar "falso" al método Desconectar lo solucionó. Su comportamiento predeterminado es llamar a DisconnectNotifyPeer, que desencadenó la segunda excepción. –