gpt4 book ai didi

c++ - boost::asio::tcp::socket 关闭并取消而不调用处理程序

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:38:38 25 4
gpt4 key购买 nike

我正在用 boost 的 asio 库编写一个服务器。服务器使用一组连接对象(围绕 boost::asio::tcp::socket 的包装类)处理许多并发连接。在 Connection 类中,使用 socket.async_read_some(...) 不断读取套接字,每当使用新数据调用读取处理程序时,都会立即再次调用 socket.async_read_some() 以读取更多数据。

现在,服务器可能会因为某种原因决定断开客户端连接,所以自然而然的做法是调用 connection.close() ,它又调用 socket.close() ,这将导致所有挂起的异步操作被取消。这导致读取处理程序(绑定(bind)到类 Connection 中的一个方法)被调用 boost::asio::error::operation_aborted。我的问题是:我不希望这种情况发生。

在 socket.close() 之后,我想销毁套接字和连接,然后从服务器的事件客户端列表中删除它的指针。但是,直到 io_service.run() 的下一次迭代才会调用读取处理程序,这意味着我不能立即销毁套接字或传递给 socket.async_read_some() 的读取处理程序,直到使用错误。所以我必须以某种方式延迟这些对象的销毁;这很烦人。

有安全的方法吗

  • 取消挂起的异步操作而不调用任何处理程序,因此我可以在 socket.close() 之后立即安全地销毁套接字,或者
  • 安全地知道何时无法调用更多处理程序

还是我的处理方式完全错误?

最佳答案

当 async.operation 完成时——无论是成功还是错误——它的完成处理程序被调用。这是重要的保证,我不认为尝试“破解”这种行为是个好主意。您在用例中遇到的问题通常可以通过使用 shared_ptr(shared_from_this 惯用语)解决:bind shared_ptr<Connection>对于处理程序,当您收到 operation_aborted(或其他一些错误)时不要发出另一个 async_read,以便当所有处理程序完成时,Connection 对象及其套接字被销毁。

关于c++ - boost::asio::tcp::socket 关闭并取消而不调用处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10627491/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com