From 3b38c1223851ac41288644e0b7618655f75fd89a Mon Sep 17 00:00:00 2001 From: defanor Date: Mon, 2 Mar 2020 03:39:32 +0300 Subject: Improve reconnect timings --- src/rexmpp.c | 22 +++++++++++++++------- src/rexmpp.h | 1 + 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/rexmpp.c b/src/rexmpp.c index 1ebe509..2ac87ce 100644 --- a/src/rexmpp.c +++ b/src/rexmpp.c @@ -16,6 +16,7 @@ #include #include #include +#include #include #include @@ -257,15 +258,22 @@ void rexmpp_done (rexmpp_t *s) { } void rexmpp_schedule_reconnect (rexmpp_t *s) { - gettimeofday(&(s->next_reconnect_time), NULL); - if (s->reconnect_number < 10) { - s->next_reconnect_time.tv_sec += (8 << s->reconnect_number); - } else { - s->next_reconnect_time.tv_sec += 3600; + if (s->reconnect_number == 0) { + gnutls_rnd(GNUTLS_RND_NONCE, &s->reconnect_seconds, sizeof(time_t)); + if (s->reconnect_seconds < 0) { + s->reconnect_seconds = - s->reconnect_seconds; + } + s->reconnect_seconds %= 60; } - rexmpp_log(s, LOG_DEBUG, "Scheduled reconnect number %d, for %u.%u", + time_t seconds = s->reconnect_seconds << s->reconnect_number; + if (seconds > 3600) { + seconds = 3600; + } + gettimeofday(&(s->next_reconnect_time), NULL); + s->next_reconnect_time.tv_sec += seconds; + rexmpp_log(s, LOG_DEBUG, "Scheduled reconnect number %d, in %d seconds", s->reconnect_number, - s->next_reconnect_time.tv_sec, s->next_reconnect_time.tv_usec); + seconds); s->reconnect_number++; } diff --git a/src/rexmpp.h b/src/rexmpp.h index 08edf43..411be7d 100644 --- a/src/rexmpp.h +++ b/src/rexmpp.h @@ -206,6 +206,7 @@ struct rexmpp /* Connection and stream management. */ unsigned int id_counter; unsigned int reconnect_number; + time_t reconnect_seconds; struct timeval next_reconnect_time; xmlNodePtr stanza_queue; uint32_t stanzas_out_count; -- cgit v1.2.3