C++ 服务器在客户端上终止连接进程后不会关闭 TCP 套接字连接

c++ server doesn't close TCP socket connection after the connection process is killed on client

本文关键字:连接 套接字 TCP 进程 服务器 客户端 终止 C++      更新时间:2023-10-16

我遇到了一个对我来说很奇怪的问题

我有一个 c++ 应用程序(服务器)部署在 centos 和客户端(也在 centos 上运行),有一个程序将通过计时器连接服务器,以便当连接数达到 1k 时,计时器停止。

我能够运行以下命令来检测服务器上的连接:

netstat -nat |grep -i "port"| grep "BUILT"

它目前工作得很好。但是,在我从客户端终止进程后,服务器上仍有大量连接处于已建立状态。即使我关闭了客户端计算机,第二天早上 10 多个小时后,我仍然能够在服务器上看到很多处于 ESTABLISHED 状态的活动连接。

即使当我杀死进程时可能会丢失数据包,以至于它无法通知服务器TCP连接已关闭,但我相信TCP中有一个默认的心跳(keepalive)机制,能够检查连接是否处于活动状态。

通过上述命令获取连接数是否可靠,否则服务器不释放关闭的连接会出什么问题?

TCP keepalive 的默认值约为 2 小时(在 BSD/Linux 实现中)。当您看到连接线在 10 小时后仍然启动时,您确定您设置了 TCP keeaplives 选项吗?我认为您的应用程序可能没有明确设置保持连接选项。一种方法是使用 get socket 选项并传递SO_TCPKEEPALIVE以检查是否确实设置了保持连接。如果未设置,请继续设置。

您可能会发现此讨论很有帮助:如何正确使用SO_KEEPALIVE选项来检测另一端的客户端是否关闭?

默认情况下,

保持连接处于关闭状态。 您必须在每个套接字中在服务器端启用它。