取消连接 boost::asio
Cancel connection is boost::asio
来自标准 SSL client 示例。假设我调用这个函数。
boost::asio::async_connect(socket_.lowest_layer(), endpoint_iterator,
boost::bind(&SSLClient::handle_connect, this,
boost::asio::placeholders::error));
但随后函数被调用,程序正在连接。我想取消我的请求并停止连接!我该怎么做?
特例:假设我在一个线程中有这些对象。在这种情况下有什么办法吗?
现在,如果我尝试这样做,程序根本就没有响应。我没有找到强制停止它的方法!
有多种方法可以达到您的要求¹。
您可以硬停止服务 (service.stop()
)。但这使您无法控制所有 运行 操作。这是 "nuclear" 方法,可以这么说。
受控方式是调用cancel()
Cancel all asynchronous operations associated with the socket.
socket_.cancel()
现在,您有维护连接对象生命周期的额外任务(大概是绑定完成处理程序中的 this
)。一个非常常用的模式是使连接 class 派生自 enable_shared_from_this
并将完成处理程序绑定到 shared_from_this()
而不仅仅是 this
.
这样,共享连接对象将在最后一个挂起的异步操作被取消后自动"go away",您不必担心连接对象泄漏。
¹ exit
、abort
、quick_exit
等的缩写:)
来自标准 SSL client 示例。假设我调用这个函数。
boost::asio::async_connect(socket_.lowest_layer(), endpoint_iterator,
boost::bind(&SSLClient::handle_connect, this,
boost::asio::placeholders::error));
但随后函数被调用,程序正在连接。我想取消我的请求并停止连接!我该怎么做?
特例:假设我在一个线程中有这些对象。在这种情况下有什么办法吗?
现在,如果我尝试这样做,程序根本就没有响应。我没有找到强制停止它的方法!
有多种方法可以达到您的要求¹。
您可以硬停止服务 (
service.stop()
)。但这使您无法控制所有 运行 操作。这是 "nuclear" 方法,可以这么说。受控方式是调用
cancel()
Cancel all asynchronous operations associated with the socket.
socket_.cancel()
现在,您有维护连接对象生命周期的额外任务(大概是绑定完成处理程序中的 this
)。一个非常常用的模式是使连接 class 派生自 enable_shared_from_this
并将完成处理程序绑定到 shared_from_this()
而不仅仅是 this
.
这样,共享连接对象将在最后一个挂起的异步操作被取消后自动"go away",您不必担心连接对象泄漏。
¹ exit
、abort
、quick_exit
等的缩写:)