【问题标题】:Linux TCP/IP Diagnosing Why TCP/IP read() Returns 0 in C ProgramLinux TCP/IP 诊断为什么 TCP/IP read() 在 C 程序中返回 0
【发布时间】:2015-03-14 05:58:12
【问题描述】:

我有许多 C 程序在 Linux 主机 (RHEL 6.6) 上运行。它们与同一主机上的其他应用程序有 TCP/IP 连接。每个连接上的流量很少。每隔一段时间,对同一主机上进程的其中一个套接字的 read() 调用返回 0。这些套接字通常在应用程序的生命周期内保持不变,因此在正常操作期间它们不会完全关闭。我希望如果发生错误,例如另一端崩溃,read() 将返回 -1 并设置 errno。

所以,问题是 - 除了 TCP/IP 连接被另一端干净地关闭(shutdown(fd); close(fd))之外,还有什么原因会导致 read() 调用返回 0?

read() 的手册页声明 0 仅在 EOF 时返回,而 recv() 手册页声明它返回“当对等方已执行有序关闭时返回 0”。我假设 read() 和 recv() 的返回是等效的,并且 TCP/IP 连接上的 EOF 意味着完全关闭。

【问题讨论】:

    标签: c linux sockets tcp


    【解决方案1】:

    所以,问题是 - 除了 TCP/IP 之外还有其他原因吗? 连接被对方​​完全关闭(shutdown(fd); close(fd)) end 会导致 read() 调用返回 0

    对于初学者来说,进程死亡将释放文件描述符,这将产生相同的效果:干净的连接关闭。

    我希望如果发生错误,例如另一端崩溃, read() 将返回 -1 并设置 errno。

    这取决于您所说的“崩溃”是什么意思。例如,如果进程终止但操作系统仍然正常,那么就 TCP 而言一切正常,它可以关闭现在孤立的套接字的连接(换句话说,与上面相同)。


    旁注:当然,您的 recv 可以通过某些方式返回 -1,因为对等点行为不端(例如,对等点可以强制 TCP 重置)。

    【讨论】:

    • 我相信 Windows 会在进程存在时重置打开的套接字,但 Unix 和 Linux 肯定会正确关闭它。
    • 这正是发生的事情 - 另一端的应用程序崩溃了,Linux 彻底关闭了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-23
    • 2012-02-09
    • 1970-01-01
    • 1970-01-01
    • 2011-08-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多