客户端使用 ssh 登录并在远程计算机上启动服务器,然后 clinet 创建到服务器的 tcp 连接。 当客户端正常退出或崩溃或网络掉线时,服务器需要退出。 那么问题是如何检测服务器所连接的客户端是否崩溃了。
第一次尝试是使用 error() 信号,捕获 QAbsoluteSocket::NetworkError 以确定网络已断开。但是即使拔掉网线我也根本收不到error()信号。
第二次尝试是使用SocketState,我认为每当SocketState为UnconnectedState时,客户端可能已经正常退出,服务器也应该退出。这种方式对于“正常退出”来说效果很好,但我不知道如何处理“崩溃”和“死网”。
帮帮我,谢谢!
最佳答案
我建议使用TCP keep alive 。不通过公众暴露QTcpSocket接口(interface),但您可以使用 setsockopt与 QAbstractSocker::socketDescriptor激活SO_KEEPALIVE功能。
编辑:似乎在某个时候将保持事件状态添加到了 QAbstractSocket 中。所以,只需调用 QAbstractSocket::setSocketOption与 QAbstractSocket::KeepAliveOption .
您可以在此处找到有关调整保持事件请求超时的信息:http://www.gnugk.org/keepalive.html
关于qt - 如何使用 Qt 检测服务器的客户端是否崩溃(或退出),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5489923/