在客户端断开连接后,Indy服务器TIdTCPServer.OnExecute连续调用

时间:2014-03-20 16:16:14

标签: delphi tcp indy

我知道我希望从客户端获得多少字节(在此代码中为100)。如果客户没有给我100,我根本不需要这个包,因为它已经损坏了。

我遇到客户端提供少于100个字节并断开连接的情况。在这种情况下,我捕捉异常并且一切都会好的,除了在此异常之后我的ServerTCPExecute被连续多次调用。没有任何其他客户连接。为什么会这样?如果我做TIdYarnOfThread(AContext.Yarn).Thread.Terminate;一切都很顺利。但我不确定这是好的解决方案。

procedure Form1.ServerTCPExecute(AContext: TIdContext);
begin
  try
    AContext.Connection.IOHandler.ReadBytes(b, 100, False);
  except
    //TIdYarnOfThread(AContext.Yarn).Thread.Terminate;
  end;
end;

1 个答案:

答案 0 :(得分:3)

解决方案:请勿使用try ... except来捕捉并忽略OnExecute中的所有异常。

这将吞下在客户端断开连接时发生的Indy异常,如果OnExecute中仍有数据,服务器将执行IOHandler.InputBuffer的下一次迭代,ReadBytes会引发另一个异常异常,因为对等体断开连接。

如果引发任何异常并离开该方法,Indy TCP服务器将关闭并清理连接。

Indy在OnExecute中使用异常进行错误处理和通知,因此不要使用"空"来禁止它们。异常处理程序如果您需要捕获异常,请重新引发您捕获的任何EIdException派生的异常,并让服务器处理它们。

p.s。:发布的代码似乎使用非局部变量b。因为TIdTCPServer是一个多线程组件,所以必须始终以线程安全的方式访问非局部变量,例如使用临界区,或将变量放在TIdContext对象内。 / p>