diff --git a/Source/MQTTnet/MqttClient.cs b/Source/MQTTnet/MqttClient.cs index bb3248ff9..9dbe960ed 100644 --- a/Source/MQTTnet/MqttClient.cs +++ b/Source/MQTTnet/MqttClient.cs @@ -1041,11 +1041,13 @@ async Task TrySendKeepAliveMessages(CancellationToken cancellationToken) if (timeWithoutPacketSent > keepAlivePeriod) { - using (var timeoutCancellationTokenSource = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken)) - { - timeoutCancellationTokenSource.CancelAfter(Options.Timeout); - await PingAsync(timeoutCancellationTokenSource.Token).ConfigureAwait(false); - } + using var pingTimeout = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken); + + // We already reached the keep alive timeout. Due to the RFC part [MQTT-3.1.2-24] the server will wait another + // 1/2 of the keep alive time. So we can also use this value as the timeout. + pingTimeout.CancelAfter(keepAlivePeriod / 2); + + await PingAsync(pingTimeout.Token).ConfigureAwait(false); } // Wait a fixed time in all cases. Calculation of the remaining time is complicated diff --git a/Source/ReleaseNotes.md b/Source/ReleaseNotes.md index fd0b17465..5e84863a6 100644 --- a/Source/ReleaseNotes.md +++ b/Source/ReleaseNotes.md @@ -13,6 +13,7 @@ * Client: MQTT 5.0.0 is now the default version when connecting with a server **(BREAKING CHANGE)** * Client: Fixed enhanced authentication. * Client: Exposed WebSocket compression options in MQTT client options (thanks to @victornor, #2127) +* Client: Fixed wrong timeout for keep alive check (thanks to @Erw1nT, #2129) * Server: Fixed enhanced authentication. * Server: Set default for "MaxPendingMessagesPerClient" to 1000 **(BREAKING CHANGE)** * Server: Set SSL version to "None" which will let the OS choose the version **(BREAKING CHANGE)**