如何使用 Qt 检测服务器的客户端是否崩溃(或退出)

jnb*_*lue 2 sockets qt

客户端使用 ssh 登录并在远程计算机上启动服务器,然后 clinet 创建到服务器的 tcp 连接。当客户端正常退出或崩溃或网络掉线时,服务器需要退出。那么问题是如何检测服务器所连接的客户端是否崩溃了。

第一次尝试是使用 error() 信号,捕获 QAbsoluteSocket::NetworkError 以确定网络已断开。但即使拔掉网线我也根本收不到error()信号。

第二次尝试是使用SocketState,我认为每当SocketState为UnconnectedState时,客户端可能已经正常退出,服务器也应该退出。这种方式对于“正常退出”来说效果很好,但我不知道如何处理“崩溃”和“死网络”。

帮帮我,谢谢!

Jud*_*den 5

我建议使用TCP keep alive。它不是通过公共QTcpSocket接口公开的,但您可以将setsockoptQAbstractSocker::socketDescriptor一起使用来激活SO_KEEPALIVE功能。

编辑:似乎在某个时刻将保持活动状态添加到了 QAbstractSocket 中。因此,只需使用QAbstractSocket::KeepAliveOption调用QAbstractSocket:: setSocketOption即可。

您可以在此处找到有关调整保持活动请求超时的信息:http://www.gnugk.org/keepalive.html