关闭套接字时,Indy会抛出多个异常。怎么做一个干净的自动重新连接?

时间:2012-06-14 06:08:06

标签: delphi sockets indy disconnect

我有一个Delphi 6应用程序,它使用Indy 9组件来维护与外部设备的持久性IdTCPConnection。有时我想断开连接,然后重新连接到设备。我发现当我这样做时,Indy会抛出多达3个单独的异常。这使得开发一个干净的重新连接策略有点凌乱,因为Indy组件在后台线程上,我不想破坏线程Execute()循环。

在尝试重新连接之前,有什么好的或干净的方式来吸收3例例?我看到的3个例外是按照出现的顺序,EIdClosedSocket,EIdConnClosedGracefully,EIdSocketError(LastError = WSAECONNABORTED)。我想等到所有与套接字关闭相关的异常都在尝试重新连接之前传播,但我不知道如何构建我的代码循环来做到这一点。

1 个答案:

答案 0 :(得分:2)

一次只能有一个异常到达您的线程代码。只需使用try/except块将代码包装在线程循环中,然后在下一次循环迭代时重新连接。

while not Terminated do
begin
  if not Client.Connected then
  try
    Client.Connect;
  except
    Sleep(2500);
    Continue;
  end;
  try
    // communicate with device as needed...
  except
    on E: EIdException do
    begin
      // Indy socket error, reconnect
      Client.Disconnect;
      Client.InputBuffer.Clear;
    end;
    on E: Exception do
    begin
      // something else happened in your code...
    end;
  end;
end;