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

时间:2013-09-10 14:42:51

标签: c++ tcp connection release netstat

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

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

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

netstat -nat | grep -i“port”| grep“ESTABLISHED”

现在它运作正常。但是,在我从客户端终止进程后,服务器上的ESTABLISHED STATUS中仍有大量连接。即使我关闭了客户端计算机,第二天早上10多个小时后,我仍然可以在服务器上看到很多活动连接状态为ESTABLISHED。

即使我杀死进程时可能会丢包,因此无法通知服务器TCP连接已关闭,我相信TCP中有一个默认的心跳(keepalive)机制,可以检查连接是否是活着。

通过上面提到的命令获得连接数是否可靠,否则服务器不会释放关闭连接会有什么不妥?

2 个答案:

答案 0 :(得分:0)

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

您可能会发现此讨论很有用:How to use SO_KEEPALIVE option properly to detect that the client at the other end is down?

答案 1 :(得分:0)

默认情况下,Keepalive off。您必须在每个插槽的服务器端启用它。