首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如果另一端不从套接字中读取数据,如何避免在Indy中写入套接字时冻结

如果另一端不从套接字中读取数据,如何避免在Indy中写入套接字时冻结
EN

Stack Overflow用户
提问于 2019-05-14 14:27:27
回答 1查看 327关注 0票数 2

我有一个使用Indy的客户端和服务器套接字的应用程序,用Delphi10.2编译。

应用程序有一个工作线程,它处理来自不同端口的请求,并使用对以下内容的调用在同一线程中写入响应:

代码语言:javascript
运行
复制
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调用,但我被困在了那里,所以我来这里寻求帮助。

如果这是不可能的,我可以在辅助线程上实现超时机制,但我不确定在我这端重置来自辅助线程的连接的正确方法是什么,以便让工作线程继续它的工作。

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56124201

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档