取消连接 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));

但随后函数被调用,程序正在连接。我想取消我的请求并停止连接!我该怎么做?

特例:假设我在一个线程中有这些对象。在这种情况下有什么办法吗?

现在,如果我尝试这样做,程序根本就没有响应。我没有找到强制停止它的方法!

有多种方法可以达到您的要求¹。

  1. 您可以硬停止服务 (service.stop())。但这使您无法控制所有 运行 操作。这是 "nuclear" 方法,可以这么说。

  2. 受控方式是调用cancel()

    Cancel all asynchronous operations associated with the socket.

    socket_.cancel()
    

现在,您有维护连接对象生命周期的额外任务(大概是绑定完成处理程序中的 this)。一个非常常用的模式是使连接 class 派生自 enable_shared_from_this 并将完成处理程序绑定到 shared_from_this() 而不仅仅是 this.

这样,共享连接对象将在最后一个挂起的异步操作被取消后自动"go away",您不必担心连接对象泄漏。

¹ exitabortquick_exit 等的缩写:)