客户端使用ssh登录并在远程计算机上启动服务器,然后clinet创建一个tcp连接到服务器。 当客户端正常退出或崩溃或网络被丢弃时,服务器需要退出。 所以问题是如何检测服务器连接的客户端是否崩溃。
第一次尝试使用error()信号,捕获QAbsoluteSocket :: NetworkError以确定网络已丢弃。但即使我拔出网线,我也无法接收到error()信号。
第二次尝试使用SocketState,我想每当SocketState为UnconnectedState时,客户端可能正常退出,服务器也应退出。这种方式适用于“正常退出”,但我不知道如何处理“崩溃”和“死网”。
帮助我,谢谢!
答案 0 :(得分:3)
我建议使用TCP keep alive。它不会通过公开QTcpSocket界面公开,但您可以setsockopt与QAbstractSocker::socketDescriptor一起使用来激活SO_KEEPALIVE功能。
编辑:似乎在某些时候将保持活动添加到QAbstractSocket。因此,只需使用QAbstractSocket::setSocketOption拨打QAbstractSocket::KeepAliveOption。
您可以在此处找到有关调整保持活动请求超时的信息:http://www.gnugk.org/keepalive.html
答案 1 :(得分:1)
大多数情况下,当您尝试使用套接字连接进行读取或写入时,唯一可以解决套接字连接问题的方法。有一些例外:如果拔掉网络电缆,Windows将更改套接字的状态,Linux(根据我的经验)不会。
检测连接问题的最可靠方法是让客户端定期与服务器以约定的间隔发送一条小消息。如果服务器在合理的时间内没有看到此消息,则应该考虑客户端已关闭并断开连接。这也将使双方有机会通过读写来检测问题。