我正在尝试用超时实现 async_connect()。
async_connect_with_timeout(socket_type & s,
std::function<void(BoostAndCustomError const & error)> const & connect_handler,
time_type timeout);
当操作完成时connect_handler(error)
调用并error
指示操作结果(包括超时)。
我希望使用超时示例 1.51中的代码。最大的不同是我使用了多个工作线程来执行 io_service.run()。
保持示例代码正常工作需要进行哪些更改?
我的问题是:
调用时:
Start() { socket_.async_connect(Handleconnect); dealine_.async_wait(HandleTimeout); }
HandleConnect()
甚至可以在另一个线程中完成async_wait()
(不太可能但可能)。我必须strand
包装Start()
,HandleConnect()
和HandleTimeout()
吗?如果
HandleConnect()
第一次调用没有错误,但deadline_timer.cancel()
或者deadline_timer.expires_from_now()
因为HandleTimeout()
“已在不久的将来排队等待调用”而失败怎么办?看起来示例代码可以HandleTimeout()
关闭套接字。这种行为(我们在连接后愉快地开始一些操作后定时器关闭连接)很容易导致严重的头痛。如果
HandleTimeout()
和socket.close()
被首先调用怎么办。是否有可能HandlerConnect()
已经“排队”而没有错误?文档说:“任何异步发送、接收或连接操作都将立即取消,并完成boost::asio::error::operation_aborted
错误”。在多线程环境中“立即”是什么意思?