"两步" async_read with boost asio

时间:2014-09-05 13:32:04

标签: c++ sockets c++11 boost boost-asio

我想使用boost asio在TCP / IP堆栈之上实现协议。协议的长度 - PDU包含在前6个字节中。现在使用asio提供的同步读取方法,我可以准确读取前6个字节,计算长度 n 然后读取 n 字节以获得整个PDU。< / p>

我宁愿使用异步方法,但是在asio文档中研究example会给我一个问题。作者使用套接字成员函数async_read_some(),它从套接字中读取(看似对我而言)不确定数量的数据。 我将如何应用我的&#34;两步&#34;第一段描述的程序接收完整的PDU?或者我的问题还有另一个明智的解决方案吗?


1 个答案:

答案 0 :(得分: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
                     }
                });
        }
    });