QT处理TCP连接心跳包问题(6)

在TCP连接中,若无心跳协议,可通过系统层设置保活选项,如开启SO_KEEPALIVE,调整TCP_KEEPIDLE、TCP_KEEPINTVL和TCP_KEEPCNT参数以防止断线。同时,博客提醒在Qt开发中不推荐在tr中直接使用中文,因为这违反了tr的初衷,且可能导致额外开销。若无翻译需求,建议避免使用tr。
摘要由CSDN通过智能技术生成

在很多网络应用程序,需要自定义心跳包来保持连接,不然断电或者非法关闭程序,对方识别不
到,需要进行超时检测,但是有些程序没有提供心跳协议,此时需要启用系统层的保活程序,此方
法适用于TCP连接。
int fd = tcpSocket->socketDescriptor();

int keepAlive = 1;
int keepIdle = 5;
int keepInterval = 2;
int keepCount = 2;
//开启keepalive属性,缺省值:0(关闭)
//如果在5秒内没有任何数据交互,则进行探测,缺省值:7200(s)
//探测时发探测包的时间间隔为2秒,缺省值:75(s)
//探测重试的次数,全部超时则认定连接失效,缺省值:9(次)

setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, (void *)&keepAlive,
sizeof(keepAlive));
setsockopt(fd, SOL_TCP, TCP_KEEPIDLE, (void *)&keepIdle, sizeof(keepIdle));
setsockopt(fd, SOL_TCP, TCP_KEEPINTVL, (void *)&keepInterval,
sizeof(keepInterval));
setsockopt(fd, SOL_TCP, TCP_KEEPCNT, (void *)&keepCount, sizeof(keepCount));

其他说明:

qt开发中非常不建议tr中包含中文,尽管现在的新版Qt支持中文到其他语言的翻译,但是很不规范,也不知道谁教的(后面发现我在刚学Qt的时候也发布了一些demo到网上也是tr包含中文的,当时就狠狠的打了自己一巴掌),tr的本意是包含英文,然后翻译到其他语言比如中文,现在大量的初学者滥用tr,如果没有翻译的需求,禁用tr,tr需要开销的,Qt默认会认为他需要翻译,会额外进行特殊处理。

Qt框架中创建TCP心跳包服务端,通常涉及到以下几个步骤: 1. **设置基础环境**:首先,你需要安装Qt库,特别是包含了网络通信模块的版本,如Qt Network。 2. **建立服务器连接**:创建一个`QTcpServer`实例,监听特定的端口。例如: ```cpp QTcpServer server; if (!server.listen(QHostAddress::Any, YOUR_PORT)) { qDebug() << "Failed to listen on port: " << server.errorString(); } ``` 3. **接受客户端连接**:当有客户端连接时,调用`waitForNewConnection()`等待并接受连接请求。 ```cpp QAbstractSocket *socket = server.nextPendingConnection(); if (!socket) { // 没有连接处理错误 } ``` 4. **心跳机制**:可以定期向客户端发送心跳包,一般是一个固定格式的数据包,比如包含时间戳或者其他标识信息。你可以使用`write()`函数将数据发送出去。 ```cpp QByteArray heartbeatData = ...; // 创建心跳数据 socket->write(heartbeatData); ``` 5. **处理数据接收和响应**:客户端也可能需要发送数据到服务端,需要在接收到数据后进行相应的处理,并可能返回确认信息。 ```cpp qint64 bytesReceived = socket->read(buffer, MAX_BYTES); // 处理接收到的数据... ``` 6. **维护连接**:记得在适当的时候管理连接,比如在长时间无响应时断开连接,或者客户端主动关闭连接时清理资源。 7. **错误处理**:加入适当的错误检查和异常处理,防止程序因意外情况崩溃。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lsa_BigDevil

你的行动是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值