有没有办法在boost asio异步完成处理程序中访问套接字句柄?我看了一下boost asio占位符,但没有存储套接字句柄的变量。
答案 0 :(得分:0)
你可以安排它,无论如何你会在外面加强或asio。
绑定一个需要例如用于公开void()
函数的套接字,您可以使用bind
:
int foo(std::string const& s, int);
std::function<void()> adapted = std::bind(foo, "hello world", 42);
所以,通常你会得到类似的代码:
boost::asio::async_connect(socket_.lowest_layer(), endpoint_iterator,
boost::bind(&client::handle_connect, this, boost::asio::placeholders::error));
注意,通过使用bind和this
,我们将成员函数绑定到完成处理程序:
struct client
{
// ....
void handle_connect(boost::system::error_code err)
{
// you can just use `this->socket_` here
// ...
}
};
这意味着在handle_connect
中我们可以使用socket_
成员变量。
但是,如果你想让事情变得复杂,你也可以使用免费功能
boost::asio::async_connect(socket_.lowest_layer(), endpoint_iterator,
boost::bind(&free_handle_connect, boost::ref(socket_), boost::asio::placeholders::error));
现在暗示的处理函数看起来像
static void free_handle_connect(
boost::asio::ip::tcp::socket& socket_,
boost::system::error_code err)
{
// using `socket_` as it was passed in
int fd = _socket.native_handle_type();
}