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