2

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

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

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

netstat -nat |grep -i "端口"| grep“已建立”

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

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

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

4

2 回答 2

0

Keepalive 默认是关闭的。您必须在服务器端的每个套接字上启用它。

于 2013-09-10T22:59:11.140 回答
0

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

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

于 2013-09-10T17:25:18.793 回答