C++ 异步写入套接字和用户值(boost::asio问题)
我是个新手。我需要一个跨平台的低层C++网络API,所以我选择了ASIO。现在,我已经成功地连接并写入了一个套接字,但是因为我使用的是异步读/写,所以我需要一种方法来跟踪请求(如果您愿意,可以使用某种ID)。我查看了文档/引用,发现没有办法将用户数据传递给我的处理程序,我能想到的唯一选项是创建一个特殊类,该类充当回调函数并跟踪其id,然后将其作为回调函数传递给套接字。有更好的办法吗?还是最好的方法?异步函数是在完成处理程序的类型上模板化的。处理程序不必是普通的“回调”,它可以是任何公开正确运算符()签名的内容 因此,您应该能够这样做:C++ 异步写入套接字和用户值(boost::asio问题),c++,boost,networking,boost-asio,C++,Boost,Networking,Boost Asio,我是个新手。我需要一个跨平台的低层C++网络API,所以我选择了ASIO。现在,我已经成功地连接并写入了一个套接字,但是因为我使用的是异步读/写,所以我需要一种方法来跟踪请求(如果您愿意,可以使用某种ID)。我查看了文档/引用,发现没有办法将用户数据传递给我的处理程序,我能想到的唯一选项是创建一个特殊类,该类充当回调函数并跟踪其id,然后将其作为回调函数传递给套接字。有更好的办法吗?还是最好的方法?异步函数是在完成处理程序的类型上模板化的。处理程序不必是普通的“回调”,它可以是任何公开正确运算符
// 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));
或者,您也可以将处理程序作为普通函数,并将其绑定到调用站点,如中所述。那么,上面的例子将是:
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
));