2012-05-09 28 views
7

この状況でどのように復旧する必要がありますか?「接続リセットによるピア」Indy TCPクライアント

サーバーがクラッシュし、接続が異常終了しました。ほとんどの場合、 "Connection Reset By Peer"例外が発生します。 exceptブロック内のTIdTCPClientオブジェクトでDisconnectを呼び出すことで修正したようですが、同じメッセージ(これは2番目のtry-exceptブロックで捕捉したもの)で1つの最終例外が発生します。

これは、Indy10と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

あなたはIdTCPConnection.pasにTIdTCPConnection.Disconnectにデバッグしようとしましたか? OnDisconnectハンドラが実行され、その接続が使用されている可能性があります。または、NotifyPeerが役割を演じます。さまざまなシナリオに関するソースのコメントも参照してください。 – mjn

+0

オブジェクトを解放して新しく新しいオブジェクトを作成すると、例外の理由を見つけるのに役立ちません。 – mjn

+0

なぜそれほど心配していませんか切断を呼び出すときに例外が発生しています。このような状況から適切に回復する方法を知りたいだけです。 –

答えて

7

これを試してみてください:

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

Disconnectメソッドに "false"を渡して固定しました。そのデフォルトの動作は、DisconnectNotifyPeerを呼び出すことです。これにより、2番目の例外がトリガされます。 –

関連する問題