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

标签 qt sockets

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

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

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

帮帮我,谢谢!

最佳答案

我建议使用TCP keep alive 。不通过公众暴露QTcpSocket接口(interface),但您可以使用 setsockoptQAbstractSocker::socketDescriptor激活SO_KEEPALIVE功能。

编辑:似乎在某个时候将保持事件状态添加到了 QAbstractSocket 中。所以,只需调用 QAbstractSocket::setSocketOptionQAbstractSocket::KeepAliveOption .

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

关于qt - 如何使用 Qt 检测服务器的客户端是否崩溃(或退出),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5489923/

相关文章:

c++ - Qt - 将 float 转换为 QString

Qt 应用程序 - 使用 TLS1.0

c++ - 模型中的QT qml模型?并可通过 qml 访问

c++ - 如何绘制自定义形状的元素?

java - 我在尝试使用 JSch 或 Socket 连接到 channel 时感到困惑和卡住了?

c# - 通过套接字发送 inkcanvas 笔划

c++ - Qt隐藏控制台窗口停止写入日志文件

javascript - net.connect.setTimeout - 连接或套接字是什么超时类型?

c++ - Linux 中可以使用数据报管道吗?

c - 我怎样才能接受多个客户端到 TCP 服务器?