【问题标题】:Indy server TIdTCPServer.OnExecute called continuously after client disconnectIndy 服务器 TIdTCPServer.OnExecute 客户端断开后连续调用
【发布时间】:2014-03-20 16:16:14
【问题描述】:

当我知道我希望从客户端获得多少字节(在此代码中为 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;

【问题讨论】:

    标签: delphi tcp indy


    【解决方案1】:

    解决方案:不要使用try ... except 来捕获和忽略OnExecute 内的所有异常。

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

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

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

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

    【讨论】:

    • 很好的解释。但是如何给 TIdContext 对象添加变量呢?
    猜你喜欢
    • 2023-03-30
    • 2012-05-02
    • 2017-03-07
    • 1970-01-01
    • 2016-07-26
    • 2018-02-09
    • 2015-05-17
    • 1970-01-01
    • 2013-03-31
    相关资源
    最近更新 更多