API, в хедере обьявлен QNetworkAccessManager.
После создания обьекта класса вызывается метод startMessagePulling, запрос данных от сервера телеграмма методом лонг пола.
Соответственно, вызывается метод делающий запрос к серверу, по получению ответа делается эмит сигнала о новом апдейте.
Но есть один нюанс, если моргает интернет, то никаких запросов не происходит еще около 2х часов после чего в qWarning я получаю сообщение похожего содержания: Warning: stream 557 finished with error: "Connection closed" и все оживает до следующей потери коннекта. Есть ли вариант как-то хендлить такие заскоки? Гуглить пробовал, но чет ничего похожего не нашел...
Спасибо.
В общем, по итогу там какая-то дичь происходит. Был переписан код ожиданием через ивентлуп и синглшот таймер который разрывает подключение и выяснил один очень интересный нюанс. Подключение зависало и не выходило за пределы программы, Charles пакеты не видел вообще. Как итог, после принудительного разрыва подключения я попробовал очистить кэши QNAM, и внезапно, все работает. 3 часа, полет нормальный, За это время только три раза коннект обрывался по таймеру, после очистки кэшей шел новый коннект к серверу и все работало штатно. Окончательный вариант вышел такой: void TelegramBot::pull(){ // if we pull is disabled, exit if(this->pullParams.isEmpty()) return; // cleanup if(this->replyPull) this->replyPull->deleteLater(); // call api this->replyPull = this->callApi("getUpdates", this->pullParams, false); QEventLoop loop; QTimer::singleShot(30*1000, &loop, &QEventLoop::quit); QObject::connect(this->replyPull, &QNetworkReply::finished, &loop, &QEventLoop::quit); loop.exec(); if(!this->replyPull->isRunning()) QTimer::singleShot(10, this, &TelegramBot::handlePullResponse); else{ replyPull->abort(); aManager.clearAccessCache(); aManager.clearConnectionCache(); QTimer::singleShot(10, this, &TelegramBot::pull); } }
Обсуждают сегодня