服务器崩溃还是只是调用`shutdown(fd,SHUT_WR)`?

时间:2018-11-28 15:30:49

标签: linux unix-socket

当服务器崩溃或仅致电shutdown(fd, SHUT_WR)时,所有read()的客户端都会返回0

如何区分它们?

如果您能帮助我,我将不胜感激。

1 个答案:

答案 0 :(得分:1)

对等方区分其他对等方崩溃与有意关闭连接的唯一可靠方法是通信协议为此目的定义了再见消息。

如果可能,每个对等方在有意关闭其连接侧时应发送协议定义的再见消息。如果对等方检测到连接已关闭/丢失并且事先未收到此类消息,则可以认为其他对等方崩溃并采取相应措施(即,客户端可以重新连接新的套接字,等等)。

进程终止时,操作系统将关闭该进程仍处于打开状态的所有活动连接。但是,幸存的对等方将收到“优美的”关闭通知还是“异常的”套接字错误,在很大程度上由相应的网络堆栈定义。这就是为什么如果区别很重要的原因,则不仅仅依赖于检测到的连接关闭的类型。让您的同龄人明确表示他们打算关闭连接。