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

时间:2015-03-13 21:54:23

标签: c linux sockets tcp

我在Linux主机(RHEL 6.6)上运行了许多C程序。它们与同一主机上的其他应用程序具有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意味着干净关闭。

1 个答案:

答案 0 :(得分:3)

  

所以,问题是 - 除了TCP / IP之外还有其他任何原因   连接被另一个干净地关闭(shutdown(fd); close(fd))   结束会导致read()调用返回0

对于初学者来说,进程死亡会释放出具有相同效果的文件描述符:一个干净的连接关闭。

  

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

这取决于你的意思"崩溃"。如果该过程例如死亡但操作系统仍然正常,那么就TCP而言,一切正常,它可以关闭现在孤立的套接字的连接(换句话说就像上面一样)。


旁注:当然,recv可能会因为行为不端的对等体而返回-1的方式(例如,对等方可以强制重置TCP)。