2012-05-09 17 views
7

In che modo dovrei essere ripristinato in questa situazione?ripristino da "Connessione ripristinata per peer" Client Indy TCP

I crash del server, quindi la connessione è stata chiusa in modo anomalo. Le chiamate a quasi tutto comportano eccezioni di "Connessione ripristinata per peer". Mi sembra di averlo risolto chiamando Disconnect sull'oggetto TIdTCPClient all'interno del blocco except, ma si traduce in un'eccezione finale con lo stesso messaggio (che ho rilevato nel secondo try-except block).

Questo è con Indy10 e 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

Hai provato a eseguire il debug in TIdTCPConnection.Disconnect in IdTCPConnection.pas? Forse un gestore OnDisconnect viene eseguito e utilizza la connessione. O il NotifyPeer gioca un ruolo, puoi anche consultare i commenti nel codice sui diversi scenari – mjn

+0

Liberare l'oggetto e la creazione di una nuova fresca vi aiuterà (ma non aiutano a trovare la ragione per l'eccezione) – mjn

+0

Io non sono tanto preoccupato per questo Ricevo un'eccezione quando si chiama disconnect. Voglio solo sapere come recuperare correttamente da una situazione come questa. –

risposta

7

Prova questo:

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

Il passaggio "false" al metodo Disconnect lo ha risolto. Il suo comportamento predefinito è chiamare DisconnectNotifyPeer, che ha attivato la seconda eccezione. –

Problemi correlati