gpt4 book ai didi

linux - 如何检查tcp peer是否关闭

转载 作者:可可西里 更新时间:2023-11-01 02:44:56 25 4
gpt4 key购买 nike

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

但是,有什么方法可以检查远程主机是否没有实际接收数据就关闭了连接?

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

提前谢谢你

最佳答案

需要明确的是,如果连接已正确关闭,recv() 不应失败。它应该返回 EOF(0 字节)。 recv() 会因为连接异常关闭而失败。

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

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

关于linux - 如何检查tcp peer是否关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16582303/

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