我遇到了一个对我来说很奇怪的问题
我有一个部署在centos和客户端的c ++应用程序(服务器)(也运行在centos上),有一个程序将通过计时器连接服务器,这样当连接数达到1k时,计时器停止
我可以运行以下命令来检测服务器上的连接:
netstat -nat | grep -i“port”| grep“ESTABLISHED”
现在它运作正常。但是,在我从客户端终止进程后,服务器上的ESTABLISHED STATUS中仍有大量连接。即使我关闭了客户端计算机,第二天早上10多个小时后,我仍然可以在服务器上看到很多活动连接状态为ESTABLISHED。
即使我杀死进程时可能会丢包,因此无法通知服务器TCP连接已关闭,我相信TCP中有一个默认的心跳(keepalive)机制,可以检查连接是否是活着。
通过上面提到的命令获得连接数是否可靠,否则服务器不会释放关闭连接会有什么不妥?
答案 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。您必须在每个插槽的服务器端启用它。