Qt 拔网线等情况下收不到disconnected()信号
Qt的network模块在拔网线、突然关机等非正常断开的情况下是不会触发disconnected信号的,因为Qt没有设置TCP keepalive,所以在非正常断开的情况下,没办法确认网络是否断开。
- 通过C/C++接口设置enableKeepalive。在触发connected()信息后,或者state() == QAbstractSocket::ConnectedState时,设置enableKeepalive。参数可以通过QAbstractSocket::socketDescriptor()获取,参数传的就是Socket id
int enableKeepalive(int fd) {const int keepalive = 1; //开启keepalive属性const int keepidle = 3; //如果连接在3秒内没有任何数据来往则进行探测const int keepinterval = 1; //探测时发包的时间间隔为1秒const int keepcount = 3; //尝试探测的次数if (setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, (char *)(&keepalive), sizeof(keepalive)) < 0) return -1;if (setsockopt(fd, IPPROTO_TCP, TCP_KEEPIDLE, (char *)(&keepidle), sizeof(keepidle)) < 0) return -1;if (setsockopt(fd, IPPROTO_TCP, TCP_KEEPINTVL, (char *)(&keepinterval), sizeof(keepinterval)) < 0) return -1;if (setsockopt(fd, IPPROTO_TCP, TCP_KEEPCNT, (char *)(&keepcount), sizeof(keepcount)) < 0) return -1;return 0;
}
2.通过QAbstractSocket::setSocketOption设置QAbstractSocket::KeepAliveOption属性。