异步写入套接字和用户值(boost :: asio问题)

时间:2010-01-22 15:58:27

标签: c++ boost networking boost-asio

我很擅长提升。我需要一个跨平台的低级C ++网络API,所以我选择了asio。现在,我已成功连接并写入套接字,但由于我正在使用异步读/写,我需要一种方法来跟踪请求(如果有的话,有一些ID)。我查看了文档/参考,我发现无法将用户数据传递给我的处理程序,我能想到的唯一选择是创建一个充当回调的特殊类并跟踪它的id,然后传递它作为回调的套接字。有没有更好的办法?或者是最好的方法吗?

1 个答案:

答案 0 :(得分:3)

async_xxx函数是根据完成处理程序的类型进行模板化的。处理程序不必是简单的“回调”,它可以是暴露正确的operator()签名的任何东西。

因此,您应该能够做到这样的事情:

// Warning: Not tested
struct MyReadHandler
{
    MyReadHandler(Whatever ContextInformation) : m_Context(ContextInformation){}

    void 
    operator()(const boost::system::error_code& error, std::size_t bytes_transferred)
    {
        // Use m_Context
        // ...            
    }

    Whatever m_Context;
};

boost::asio::async_read(socket, buffer, MyReadHander(the_context));

或者,您也可以将处理程序作为普通函数并在调用站点绑定它,如asio tutorial中所述。上面的例子将是:

void 
HandleRead(
    const boost::system::error_code& error, 
    std::size_t bytes_transferred
    Whatever context
)
{
    //...
} 

boost::asio::async_read(socket, buffer, boost::bind(&HandleRead,
   boost::asio::placeholders::error_code,
   boost::asio::placeholders::bytes_transferred,
   the_context
));