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

server crash or just call `shutdown(fd, SHUT_WR)`?

当服务器崩溃或只调用 shutdown(fd, SHUT_WR) 时,客户端全部 read() return 0.

如何区分?

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

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

如果可能,每个对等点在有意关闭其连接端时都应发送协议定义的再见消息。如果一个对等点检测到连接已经 closed/lost 并且事先没有收到这样的消息,它可以假设另一个对等点崩溃并采取相应的行动(即,客户端可以重新连接到新的套接字等)。

当一个进程终止时,OS 将关闭该进程仍然打开的所有活动连接。但是,幸存的对等点是否会收到 "graceful" 关闭通知或 "abnormal" 套接字错误在很大程度上由各自的网络堆栈实现定义。这就是为什么,如果区分很重要,不要仅仅依赖于检测到的连接关闭类型。让您的同伴明确表示他们打算关闭连接。