gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 02:39:35 27 4
gpt4 key购买 nike

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

最佳答案

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

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

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

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

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

关于delphi - Indy 服务器 TIdTCPServer.OnExecute 在客户端断开连接后连续调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22538962/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com