【问题标题】:Cancel connection is boost::asio取消连接是 boost::asio
【发布时间】:2015-07-08 22:24:46
【问题描述】:

来自标准的SSL client 示例。假设我调用了这个函数。

    boost::asio::async_connect(socket_.lowest_layer(), endpoint_iterator,
                               boost::bind(&SSLClient::handle_connect, this,
                                           boost::asio::placeholders::error));

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

特殊情况:假设我在一个线程中有这些对象。在这种情况下有没有办法做到这一点?

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

【问题讨论】:

  • “现在如果我尝试这样做” - 做什么?

标签: c++ multithreading boost connect disconnect


【解决方案1】:

有几种方法可以实现您想要的 ¹。

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

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

    取消所有与套接字关联的异步操作。

    socket_.cancel()
    

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

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

¹ 短于exit、abort、quick_exit 等:)

【讨论】:

    猜你喜欢
    • 2017-08-22
    • 1970-01-01
    • 2011-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-25
    • 2010-12-31
    • 1970-01-01
    相关资源
    最近更新 更多