首页 > 编程语言 >QtMqtt 源码编译设置KeepAlive后ping包超时错误不返回问题修复(QMQTT::MqttNoPingResponse,QMQTT::ClientPrivate::onPingTimeo)

QtMqtt 源码编译设置KeepAlive后ping包超时错误不返回问题修复(QMQTT::MqttNoPingResponse,QMQTT::ClientPrivate::onPingTimeo)

时间:2022-12-20 17:37:27浏览次数:37  
标签:定时器 ClientPrivate pingResponseTimer frame QMQTT 源码 超时


调用 setKeepAlive() 设置心跳包后,心跳可以正常收发

QtMqtt 源码编译设置KeepAlive后ping包超时错误不返回问题修复(QMQTT::MqttNoPingResponse,QMQTT::ClientPrivate::onPingTimeo)_Qt

此时断开网络出现如下情况

QtMqtt 源码编译设置KeepAlive后ping包超时错误不返回问题修复(QMQTT::MqttNoPingResponse,QMQTT::ClientPrivate::onPingTimeo)_心跳包_02

明显出现还未超时就重启了超时定时器,查看源码如下:

void QMQTT::ClientPrivate::onTimerPingReq()
{
if (!isConnectedToHost())
return;
Frame frame(PINGREQ);
sendFrame(frame);
_pingResponseTimer.start(); // 直接就重启了定时器永远不会超时
}

在启动超时定时器时判断定时器是否活动,处于非活动状态才能启动,修改代码如下:

void QMQTT::ClientPrivate::onTimerPingReq()
{
if (!isConnectedToHost())
return;
Frame frame(PINGREQ);
sendFrame(frame);
if(!_pingResponseTimer.isActive()) {
_pingResponseTimer.start();
}
}

修改完后编译测试可正常超时断连。

QtMqtt 源码编译设置KeepAlive后ping包超时错误不返回问题修复(QMQTT::MqttNoPingResponse,QMQTT::ClientPrivate::onPingTimeo)_Qt_03


标签:定时器,ClientPrivate,pingResponseTimer,frame,QMQTT,源码,超时
From: https://blog.51cto.com/u_15918664/5956344

相关文章