Я написал асинхронную реализацию сокета SSL с использованием автономного asio и пытаюсь восстановить соединение после сброса / закрытия соединения сервером. Я довольно новичок в библиотеке asio, поэтому, пожалуйста, потерпите меня.
Поток, который вызывает io_context::run
, остается заблокированным даже после отключения из-за steady_timer
. Моя логика close()
отвечает за сброс ресурсов сокета, а также за попытку уничтожить таймер. Вот как выглядит мой код прямо сейчас:
Создание моей асинхронной работы:
timer.async_wait(std::bind(&ssl_socket::heartbeat, this));
В моем close()
методе:
timer.expires_at(std::chrono::steady_clock::now());
timer.cancel();
Согласно документам boost , cancel()
следует:
Отмена любых асинхронных операций, ожидающих на таймере.
Возможно, я неверно истолковал это, но я бы подумал, что это также отменяет асинхронную работу, связанную с io_context
, но это не так. io_context::run
никогда не освобождается и создает тупик.
Вот так выглядит мой обработчик таймера:
void ssl_socket::heartbeat() {
spdlog::get("console")->trace("heartbeat called");
if (connected_) {
write(heartbeat_token);
spdlog::get("console")->trace("heartbeat sent");
}
timer.expires_at(std::chrono::steady_clock::now() + std::chrono::seconds(heartbeat_interval));
timer.async_wait(std::bind(&ssl_socket::heartbeat, this));
}
Я бы хотел, чтобы обработчику не приходилось проверять, должен ли он обновить таймер и позволить close()
справиться с этим (если это возможно).