我在C中运行tcp服务器,在python中运行tcp客户端。两者都在不同的硬件中运行让我们将硬件A视为服务器,将硬件B视为客户端。如果我优雅地退出硬件A中的执行,它将向客户端(硬件B)发送一个空数据包,以便客户端知道连接已断开连接。但是,我不是直接退出,而是直接关闭硬件A.现在客户端(硬件B)没有得到连接断开的空数据包的通知。如何处理这种情况?当硬件A断电时,客户端如何知道断开连接?
答案 0 :(得分:0)
如果TCP连接空闲,客户端很长时间都不知道(可能永远不会)。
如果客户端尝试向服务器发送任何数据,则当服务器断电时,客户端的TCP数据包将停止被服务器确认;客户端的TCP堆栈将尝试重新发送数据包几次,但在几分钟内它将放弃并单方面关闭TCP套接字。此时套接字将select()准备好读取,并且套接字上的read()的下一次调用将返回0,表示连接已关闭。
因此,如果您想要优雅地处理这个场景,那么要做的是定期在套接字上发送一些虚拟数据(即服务器在收到它时会忽略的东西)。这足以确保客户端的本地TCP堆栈检测并处理问题。