diff options
Diffstat (limited to 'src/mqtt/qmqttconnection.cpp')
-rw-r--r-- | src/mqtt/qmqttconnection.cpp | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/src/mqtt/qmqttconnection.cpp b/src/mqtt/qmqttconnection.cpp index 8ef8fff..6759306 100644 --- a/src/mqtt/qmqttconnection.cpp +++ b/src/mqtt/qmqttconnection.cpp @@ -578,11 +578,19 @@ bool QMqttConnection::sendControlPingRequest() if (m_internalState != QMqttConnection::BrokerConnected) return false; + // 3.1.2.10 If a Client does not receive a PINGRESP packet within a reasonable amount of time + // after it has sent a PINGREQ, it SHOULD close the Network Connection to the Server + // Consider two pending PINGRESP as reasonable. + if (m_pingTimeout > 1) { + closeConnection(QMqttClient::ServerUnavailable); + return false; + } const QMqttControlPacket packet(QMqttControlPacket::PINGREQ); if (!writePacketToTransport(packet)) { qCDebug(lcMqttConnection) << "Failed to write PINGREQ to transport."; return false; } + m_pingTimeout++; return true; } @@ -591,6 +599,7 @@ bool QMqttConnection::sendControlDisconnect() qCDebug(lcMqttConnection) << Q_FUNC_INFO; m_pingTimer.stop(); + m_pingTimeout = 0; m_activeSubscriptions.clear(); @@ -676,6 +685,7 @@ void QMqttConnection::transportConnectionClosed() m_readBuffer.clear(); m_readPosition = 0; m_pingTimer.stop(); + m_pingTimeout = 0; if (m_internalState == BrokerDisconnected) // We manually disconnected m_clientPrivate->setStateAndError(QMqttClient::Disconnected, QMqttClient::NoError); else @@ -730,6 +740,7 @@ void QMqttConnection::closeConnection(QMqttClient::ClientError error) m_readBuffer.clear(); m_readPosition = 0; m_pingTimer.stop(); + m_pingTimeout = 0; m_activeSubscriptions.clear(); m_internalState = BrokerDisconnected; m_transport->disconnect(); @@ -1620,6 +1631,7 @@ void QMqttConnection::finalize_pingresp() closeConnection(QMqttClient::ProtocolViolation); return; } + m_pingTimeout--; emit m_clientPrivate->m_client->pingResponseReceived(); } |