如何检查tcp peer是否已关闭

时间:2013-05-16 08:18:19

标签: linux sockets tcp

我与远程主机有TCP网络连接。(windows或linux) 如果远程主机进程终止,则recv()失败 我知道连接已关闭。

但是,有没有办法检查远程主机 已关闭连接而没有实际接收数据?

关键是,我想定期检查远程主机是否还活着 但我不想提供或接收任何数据。

提前谢谢

2 个答案:

答案 0 :(得分:4)

要清楚,如果连接已正确关闭,recv()不应该失败。它应该返回EOF(0字节)。如果连接异常关闭,recv()将失败。

要检查连接是否已关闭而未实际接收数据(如果尚未接收),则最好的做法是使用recvmsg()标记调用MSG_PEEK。只要一个字节。如果连接已关闭,那么您将获得EOF(正常关闭)或错误(异常关闭)。如果它尚未关闭,您将获得EAGAIN(假设您将套接字置于非阻塞模式)或一个字节的数据。所以,是的,从技术上讲,你收到了一个字节的数据,但由于MSG_PEEK内核没有记录你所做的事实,所以就好像你没有。这一切都假设您已经从内核的缓冲区中读出了在预期错误可能发生之前到达的流中的所有数据。

当然rakib的评论适用:“如果您不想提供或收回数据,则无法检查远程主机是否处于活动状态。”这意味着此方法不会检测远程主机在不关闭连接的情况下从网络中消失的情况等...

答案 1 :(得分:1)

如果您通过select()监视套接字的ready-for-read状态,则select()将返回并指示套接字已准备好读取数据。然后,当您尝试recv()该数据时,recv()将失败(如果有错误)或返回0(如果连接已完全关闭则指示EOF)。