使用boost asio实现“两步”异步读取操作

4
我希望使用boost asio在TCP/IP协议栈上实现一个协议。协议-PDU的长度包含在其前6个字节中。现在,使用asio提供的同步读取方法,我可以精确地读取前6个字节,计算长度n,然后读取n个字节以获取整个PDU。
虽然我更愿意使用异步方法,但是研究asio文档中的example后,我有一个问题。作者使用套接字成员函数async_read_some(),它从套接字中读取一个(对我来说似乎是)不确定数量的数据。 我如何应用第一段描述的“两步”过程以接收完整的PDU?或者,是否有其他建议解决我的问题的方法?
1个回答

4
使用非成员函数 async_read 来读取固定数量的数据。
例如,使用 std::vector 或类似的缓冲区:
// read the header
buffer.resize(6);
async_read(socket, boost::asio::buffer(buffer),
    [=](const boost::system::error_code & error, size_t bytes){
        if (!error) {
            assert(bytes == 6);

            // read the payload
            buffer.resize(read_size(buffer));
            async_read(socket, boost::asio::buffer(buffer),
                [=](const boost::system::error_code & error, size_t bytes){
                     if (!error) {
                          // process the payload
                     }
                });
        }
    });

在第一个async_read的ReadHandler中调用第二个async_read是我想不到的。谢谢。 - Marius Herzog

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接