我以这种方式调用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)
);
}
现在,在我的代码中,可能在调用send
和handle_send
之间,我传递的套接字被破坏,因为tcp_socket_pointer
超出了它的范围。
合法吗?我的意思是,在异步操作完成之前,我是否需要确保引用的tcp :: socket持续存在? 我的直觉告诉我asio :: async_write立即进行系统调用,所以我不用担心,但我最好问:)。
如果它没有像我期待的那样工作,那么将tcp_socket_pointer
作为参数传递给handle_send
是个好主意,以确保tcp ::它指向的套接字没有过期?
答案 0 :(得分:4)
您可以使用此功能,但在async_*
被销毁时,tcp::socket
来电将被取消。
您可能希望将一个shared_ptr保存到套接字并将其绑定到完成处理程序,以便它保留一个引用,这正是您所描述的。