gpt4 book ai didi

c++ - Boost.Asio: socket::close 不取消 aysnc_read_some

转载 作者:行者123 更新时间:2023-11-28 03:10:04 26 4
gpt4 key购买 nike

我有一个执行 async_read_some 的 boost 套接字:

socket_.async_read_some(boost::asio::buffer(data_, max_length),
boost::bind(&Session::handle_read, this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));

当我的 Session 类被删除时 socket_.close() 被调用。我认为这会取消 async_read_some 并调用 Session::handle_read 并出错。

然而事实并非如此,查看 basic_socket.hpp

/// Close the socket.
/**
* This function is used to close the socket. Any asynchronous send, receive
* or connect operations will be cancelled immediately, and will complete
* with the boost::asio::error::operation_aborted error.
*
* @throws boost::system::system_error Thrown on failure. Note that, even if
* the function indicates an error, the underlying descriptor is closed.
*
* @note For portable behaviour with respect to graceful closure of a
* connected socket, call shutdown() before closing the socket.
*/
void close()

没有提到读取被取消。所以我的问题是,如何取消读取以便干净地关闭套接字?

最佳答案

首先,它应该在下一个run 时调用句柄。 , run_one , poll , 或 poll_one被调用,假设 io_service仍处于有效状态。取消/关闭不会突然改变在 ASIO 中调用处理程序的行为。

因此,如果您在删除 Session 时触发此操作,您将拥有 UB,因为处理程序将在被销毁的对象上调用,因为您向它传递了原始指针,该指针随后被删除。

我常用的方法是使用 shared_ptr结合疙瘩图案的变体。我通常在共享指针中实现,并将其传递给各种 ASIO 调用。当外部接口(interface)被销毁时,我在 pimpl 上调用一个关闭方法,这导致 ASIO 取消它的操作,然后接口(interface)重置它的共享指针拷贝。

一旦 ASIO 调用存储的处理程序,它将不再拥有共享指针的拷贝,并且销毁将完成。

关于c++ - Boost.Asio: socket::close 不取消 aysnc_read_some,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18717357/

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