如何设置QTcpSocket的KeepAlive心跳间隔?
Qt 配置TCP KeepAlive 间隔的实现方式
Qt 有对应功能的实现方案,根据你使用的 Qt 版本可以选择不同的实现方式:
Qt 6.1及以上版本(跨平台通用,最简便)
Qt 从 6.1 版本开始已经在QAbstractSocket类中新增了 3 个 TCP KeepAlive 相关的配置枚举,直接调用setSocketOption即可完成和 Pythonsock.ioctl等效的配置,不需要依赖平台原生API:
// 先开启KeepAlive功能 socket->setSocketOption(QAbstractSocket::KeepAliveOption, true); // 对应Python参数(1, 10000, 3000):空闲10秒后开始发探测包 socket->setSocketOption(QAbstractSocket::TcpKeepAliveTime, 10); // 探测包发送间隔3秒 socket->setSocketOption(QAbstractSocket::TcpKeepAliveInterval, 3); // 最大探测失败次数,超过后判定连接断开 socket->setSocketOption(QAbstractSocket::TcpKeepAliveProbes, 3);
注意:以上参数中时间类配置的单位为秒,传整数类型即可
Qt 6.1以下版本
低版本 Qt 没有封装相关跨平台接口,需要获取原生 socket 描述符后调用对应平台的系统 API 配置,逻辑和 Python 的 ioctl 调用一致:
// 需在socket成功连接后调用,才能获取到有效的socket描述符 qintptr sockFd = socket->socketDescriptor(); #ifdef Q_OS_WIN #include <winsock2.h> #include <mstcpip.h> tcp_keepalive val = { .onoff = 1, .keepalivetime = 10000, // 空闲时间,单位毫秒 .keepaliveinterval = 3000 // 探测间隔,单位毫秒 }; DWORD bytesReturned; WSAIoctl(sockFd, SIO_KEEPALIVE_VALS, &val, sizeof(val), NULL, 0, &bytesReturned, NULL, NULL); #else #include <netinet/tcp.h> int idleTime = 10; // 空闲时间,单位秒 setsockopt(sockFd, IPPROTO_TCP, TCP_KEEPIDLE, &idleTime, sizeof(idleTime)); int interval = 3; // 探测间隔,单位秒 setsockopt(sockFd, IPPROTO_TCP, TCP_KEEPINTVL, &interval, sizeof(interval)); int probes = 3; // 最大探测次数 setsockopt(sockFd, IPPROTO_TCP, TCP_KEEPCNT, &probes, sizeof(probes)); #endif
内容的提问来源于stack exchange,提问作者jett chen
相关产品推荐
相关产品推荐

