取消连接是boost::asio

问题描述 投票:0回答:1

来自标准 SSL 客户端 示例。假设我调用这个函数。

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

但是随后该函数被调用,并且程序正在连接。我想取消我的请求并停止连接!我怎样才能做到这一点?

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

现在,如果我尝试这样做,程序根本不会响应。我看不出有什么办法可以强制它停止!

c++ multithreading boost boost-asio disconnect
1个回答
0
投票

有多种方法可以实现您想要的结果 ¹。

  1. 您可以硬停止服务 (

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

  2. 受控方式是调用

    cancel()

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

    socket_.cancel()
    

现在,您还有维护连接对象生命周期的额外任务(大概是绑定完成处理程序中的

this
)。一种非常常见的模式是使连接类派生自
enable_shared_from_this
并将完成处理程序绑定到
shared_from_this()
而不仅仅是
this

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

¹ 缺少

exit
abort
quick_exit
等 :)

© www.soinside.com 2019 - 2024. All rights reserved.