我有一个使用Indy的客户端和服务器套接字的应用程序,用Delphi10.2编译。
应用程序有一个工作线程,它处理来自不同端口的请求,并使用对以下内容的调用在同一线程中写入响应:
procedure TMyCommManager.WriteResponse(AHandler: TIdIOHandler; SomeData: SomeType);
var
idBytes: TidBytes;
PacketSize: Integer;
begin
SomeData.GetBytes(idBytes, PacketSize);
AHandler.Write(DataBuffer, PacketSize);
end;
几乎所有的时间都在按预期工作,但是我们注意到工作线程在生产中时不时地冻结。经过多次迭代,我们终于到达了这样一个点:所有这些都发生在对TidIOHandler.Write()
的调用中,我非常确定它正在发生,因为单个端口的另一端没有从套接字读取响应。
在从另一端重置到端口之后,工作线程解冻并继续按预期工作。
我找到了Remy Lebeau to this answer Delphi (Indy) Server Freezing on Write中的问题,他在评论中提到(重点是我的):
Indy使用阻塞套接字,因此如果客户端没有在其端上读取入站数据,最终套接字的内部发送缓冲区将被填满,并且套接字将在服务器端变得阻塞,等待客户端清空缓冲区。在这种情况下避免死锁的唯一方法是直接使用套接字设置套接字级别的发送超时。Indy在其逻辑中不实现发送超时。
我正在寻找设置超时的正确方法,通过INDY或通过Windows中的直接API调用,但我被困在了那里,所以我来这里寻求帮助。
如果这是不可能的,我可以在辅助线程上实现超时机制,但我不确定在我这端重置来自辅助线程的连接的正确方法是什么,以便让工作线程继续它的工作。
https://stackoverflow.com/questions/56124201
复制相似问题