我们如何在boost asio完成处理程序中访问套接字句柄?

时间:2014-02-26 18:02:18

标签: boost boost-asio

有没有办法在boost asio异步完成处理程序中访问套接字句柄?我看了一下boost asio占位符,但没有存储套接字句柄的变量。

1 个答案:

答案 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();
}