如何在套接字客户端程序中判断远程连接是否断开(例如,服务器宕机)。当我做一个 recv 并且服务器已经关闭时,如果没有设置任何超时,它会被阻塞。然而在我的情况下,我无法设置可靠的超时值来解决这个问题,因为否则即使服务器正常运行但响应时间比我设置的超时值更长时,recv 也会超时。
如何在套接字客户端程序中判断远程连接是否断开(例如,服务器宕机)。当我做一个 recv 并且服务器已经关闭时,如果没有设置任何超时,它会被阻塞。然而在我的情况下,我无法设置可靠的超时值来解决这个问题,因为否则即使服务器正常运行但响应时间比我设置的超时值更长时,recv 也会超时。
如果远程主机在不发送tcp FIN
包的情况下崩溃,则无法检测到此问题。您可以通过在已建立该端口的连接之后将端口防火墙化来测试该行为。您的程序将永远“挂起”。
然而,Linux内核支持一种名为TCP keep alives的机制,旨在在给定的超时时间后关闭tcp连接。如果您无法为应用程序指定超时时间,则没有可靠的机会使用该功能。最后的机会可能是使用应用程序协议的功能(您能否命名它?),如果该协议不支持连接处理功能,则可以在其上自行“发明”一些东西。