【发布时间】:2019-04-21 17:06:30
【问题描述】:
我使用独立的 asio 编写了一个异步 SSL 套接字实现,并且在服务器重置/关闭连接后努力让它重新连接。我对 asio 库比较陌生,所以请多多包涵。
由于steady_timer,即使在断开连接后,调用io_context::run 的线程仍然被阻塞。我的close() 逻辑负责重置套接字资源,还负责尝试终止计时器。这就是我的代码现在的样子:
创建我的异步作业:
timer.async_wait(std::bind(&ssl_socket::heartbeat, this));
在我的close() 方法中:
timer.expires_at(std::chrono::steady_clock::now());
timer.cancel();
根据boost docs,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() 处理(如果可能的话)。
【问题讨论】:
-
@tkausl 哎呀,忘了。正在更新 OP。