You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何设置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 08:36:06