在调用async_write时我是否需要关心套接字的生命周期?

时间:2014-09-03 13:05:59

标签: c++ boost boost-asio

我以这种方式调用asio :: async_write:

namespace asio = boost::asio;
using asio::ip::tcp;
using std::string;

shared_pointer<tcp::socket> tcp_socket_pointer;
string message;

...

void send() {
    asio::async_write(
        *tcp_socket_pointer,
        asio::buffer(message),
        boost::bind(
            &handle_send, // defined elsewhere
            asio::placeholders::error,
            asio::placeholders::bytes_transferred)
    );
}

现在,在我的代码中,可能在调用sendhandle_send之间,我传递的套接字被破坏,因为tcp_socket_pointer超出了它的范围。

合法吗?我的意思是,在异步操作完成之前,我是否需要确保引用的tcp :: socket持续存在? 我的直觉告诉我asio :: async_write立即进行系统调用,所以我不用担心,但我最好问:)。

如果它没有像我期待的那样工作,那么将tcp_socket_pointer作为参数传递给handle_send是个好主意,以确保tcp ::它指向的套接字没有过期?

1 个答案:

答案 0 :(得分:4)

您可以使用此功能,但在async_*被销毁时,tcp::socket来电将被取消。

您可能希望将一个shared_ptr保存到套接字并将其绑定到完成处理程序,以便它保留一个引用,这正是您所描述的。