Linux TCP/IP 在 C 程序中诊断为什么 TCP/IP read() Returns 0

Linux TCP/IP Diagnosing Why TCP/IP read() Returns 0 in C Program

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

所以,问题是 - 除了 TCP/IP 连接被另一端彻底关闭(shutdown(fd); close(fd))之外,是否还有任何其他原因会导致 read() 调用到 return 0?

read() 的手册页指出 0 仅 returned 用于 EOF,而 recv() 手册页指出 returns "0 当对等方已有序执行关闭”。我假设来自 read() 和 recv() 的 return 是等效的,并且 TCP/IP 连接上的 EOF 意味着干净关闭。

So, the question is - is there any reason other than the TCP/IP connection being closed cleanly (shutdown(fd); close(fd)) by the other end that would cause the read() call to return 0

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

I would expect that if an error occurs such as the other end crashing, the read() will return -1 and set errno.

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


旁注:当然有一些方法可以让您的 recv 可以 return -1 因为对等方行为不当(例如对等方可以强制重置 TCP)。