来自标准 SSL 客户端 示例。假设我调用这个函数。
boost::asio::async_connect(socket_.lowest_layer(), endpoint_iterator,
boost::bind(&SSLClient::handle_connect, this,
boost::asio::placeholders::error));
但是随后该函数被调用,并且程序正在连接。我想取消我的请求并停止连接!我怎样才能做到这一点?
特殊情况:假设我在一个线程中有这些对象。这种情况有办法吗?
现在,如果我尝试这样做,程序根本不会响应。我看不出有什么办法可以强制它停止!
有多种方法可以实现您想要的结果 ¹。
您可以硬停止服务 (
service.stop()
)。但这使您无法控制所有正在运行的操作。可以说,这是“核”方法。cancel()
取消与套接字关联的所有异步操作。
socket_.cancel()
现在,您还有维护连接对象生命周期的额外任务(大概是绑定完成处理程序中的
this
)。一种非常常见的模式是使连接类派生自 enable_shared_from_this
并将完成处理程序绑定到 shared_from_this()
而不仅仅是 this
。
这样,共享连接对象将在最后一个挂起的异步操作被取消后自动“消失”,并且您不必担心泄漏连接对象。
¹ 缺少
exit
、abort
、quick_exit
等 :)