带升压 ASIO 的"two-step" async_read

"two-step" async_read with boost asio

本文关键字:two-step async read ASIO      更新时间:2023-10-16

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

不过,我更愿意使用异步方法,但研究asio文档中的示例会给我留下一个问题。作者使用了套接字成员函数async_read_some(),它从套接字中读取(对我来说)不确定数量的数据。我将如何应用第一段中描述的"两步"程序来接收完整的PDU?或者我的问题还有其他可取的解决办法吗?


使用非成员函数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
                     }
                });
        }
    });