C++ 服务器在客户端上终止连接进程后不会关闭 TCP 套接字连接
c++ server doesn't close TCP socket connection after the connection process is killed on client
我遇到了一个对我来说很奇怪的问题
我有一个 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选项来检测另一端的客户端是否关闭?
默认情况下,
保持连接处于关闭状态。 您必须在每个套接字中在服务器端启用它。
相关文章:
- 当套接字连接断开时检测C/C++Unix
- 套接字连接"Operation not permitted"错误,甚至使用升压/平发器根.cpp
- C++套接字客户端到 Python 服务器未创建连接
- 在不知道套接字的情况下关闭网络连接
- 当对套接字 send() 的同步调用由于连接另一端丢失而被阻止时,如何恢复?
- 当客户端在 write() 期间终止连接时,由对等套接字错误重置连接
- 从网链套接字请求连接设备的列表
- C++ TCP 套接字通信 - 连接按预期工作,几秒钟后失败,没有收到新数据,read() 和 recv() 块
- 如何在 2 台主机之间保持 UDP 套接字连接打开
- C++关闭套接字以启动新连接
- Opencv 不适用于套接字连接
- 使用单个套接字处理多个传入的 UDP 连接
- 连接UDP套接字,但仍然接收来自其他源的数据报
- C++通过套接字连接发送矢量
- 为什么我在蓝牙连接()上收到"java.io.IOException:读取失败,套接字可能关闭或超时,读取re
- boost1.62 在 docker 容器中重新连接后套接字损坏
- 尝试连接到 TCP 套接字 (Linux) 时连接被拒绝
- 仅通过建立一次TCP连接将Recv从客户端发送到服务器套接字
- 接受套接字,但m_socket.远程终结点引发 传输终结点未连接
- 提振.Asio:对每个连接/套接字使用“io_service”是件好事吗?