Indy TCP 客户端如何从 "Connection Reset By Peer" 错误中恢复?

11

在这种情况下,我应该如何进行恢复?

服务器崩溃了,因此连接被异常关闭。几乎所有调用都会导致“Connection Reset By Peer”异常。通过在except块中对TIdTCPClient对象调用Disconnect方法似乎已经解决了这个问题,但最终会出现一条相同消息的异常(我已经在第二个try-except块中捕获了这条异常)。

这是使用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;

你尝试过在IdTCPConnection.pas中调试TIdTCPConnection.Disconnect吗?也许会执行OnDisconnect处理程序并使用连接。或者NotifyPeer起到作用,有关不同情况的注释也可以看源代码中的内容。 - mjn
释放对象并创建一个全新的对象会有所帮助(但不会帮助找到异常的原因)。 - mjn
我并不太关心为什么在调用disconnect时会出现异常,我只想知道如何正确地从这种情况中恢复过来。 - Andy Clark
这是我认为相关的内容(所以随时可以要求更多)。客户端是我们GUI,它向我们系统内的服务器发出命令。客户端应该识别连接失败并尝试重新连接,直到连接已重新建立。我现在已经完全按照自己的意愿工作了。当服务器正确终止时,它调用DisconnectNotifyPeers,并且连接会被干净地关闭。当服务器异常终止时,客户端将识别此情况并采取适当措施。问题在于代码。我将在下面发布它。 - Andy Clark
我无法弄清楚如何在这些评论中格式化代码,因此我将其放在[pastie](http://pastie.org/3884729)上。 - Andy Clark
显示剩余3条评论
1个回答

11

试试这个:

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; 

2
将“false”传递给Disconnect方法解决了问题。它的默认行为是调用DisconnectNotifyPeer,这会触发第二个异常。 - Andy Clark

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接