Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 异步写入套接字和用户值(boost::asio问题)_C++_Boost_Networking_Boost Asio - Fatal编程技术网

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

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

我是个新手。我需要一个跨平台的低层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
));