一尘不染

是否检测套接字挂起而不发送或接收?

linux

我正在编写一个TCP服务器,可能需要15秒钟或更长时间才能开始生成对某些请求的响应主体。如果响应需要几秒钟才能完成,则某些客户端希望在其末端关闭连接。

由于生成响应非常占用CPU,因此我宁愿在客户端关闭连接时立即停止任务。目前,直到我发送第一个有效载荷并收到各种挂断错误后,我才发现这一点。

如何检测对等端已关闭连接而没有发送或接收任何数据?这意味着recv所有数据都保留在内核中,或者send实际上没有数据传输。


阅读 230

收藏
2020-06-03

共1个答案

一尘不染

我经常遇到与具有单独TCP链接进行发送和接收的设备通信的问题。基本问题是,当您尝试读取时,TCP堆栈通常不会告诉您套接字已关闭-
您必须尝试写入以告知链接的另一端已断开。部分地,这就是TCP的设计方式(读取是被动的)。

我猜布莱尔的答案适用于套接字在另一端被很好地关闭的情况(即,他们已经发送了正确的断开连接消息),但是在另一端不礼貌地只是停止监听的情况下却没有。

在邮件的开头是否有一个固定格式的标头,可以在整个响应准备好之前从发送开始?例如XML文档类型?您还能在消息中的某些位置发送一些额外的空格吗—只是输出一些空数据以确保套接字仍处于打开状态,您还能避免这种情况吗?

2020-06-03