【问题标题】:recovering from "Connection Reset By Peer" Indy TCP Client从“对等连接重置”Indy TCP 客户端恢复
【发布时间】:2012-05-17 23:56:01
【问题描述】:

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

服务器崩溃,连接异常关闭。对几乎所有内容的调用都会导致“对等连接重置”异常。我似乎已经通过在 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 发挥作用,另见源码中的 cmets 了解不同的场景
  • 释放对象并创建一个新对象会有所帮助(但无助于查找异常原因)
  • 我不太关心为什么在调用断开连接时会出现异常。我只是想知道如何从这种情况中正确恢复。
  • 这很难说不知道程序做什么
  • 这是我认为相关的(所以请随时询问更多)。客户端是我们的 GUI,它向我们系统内的服务器发出命令。客户端应在连接失败时识别并尝试重新连接,直到重新建立连接。我现在完全按照我的意愿工作。当服务器正确终止时,它会调用 DisconnectNotifyPeers,并干净地关闭连接。当服务器异常终止时,客户端会认识到这一点并采取适当的行动。问题出在代码上。我会在下面发布。

标签: delphi tcp indy


【解决方案1】:

试试这个:

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; 

【讨论】:

  • 将“false”传递给 Disconnect 方法修复了它。它的默认行为是调用 DisconnectNotifyPeer,这触发了第二个异常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-15
  • 1970-01-01
  • 2017-12-30
  • 2010-11-18
  • 1970-01-01
  • 2014-05-29
  • 1970-01-01
相关资源
最近更新 更多