到目前为止,我们集中在通过缓冲视图操作固定大小的内存块上。但是,当你处理类似流的数据流而不是固定大小的消息时,使用可调整大小的内存缓冲可能更方便。在这种情况下,你可能更喜欢处理动态缓冲区。
动态缓冲区是一个概念。动态缓冲区是一个可以写入数据或从中读取数据的缓冲区。如果缓冲区不足以容纳你的数据,它将动态调整大小(增长)。因此,当你向动态缓冲区写入数据时,你不必担心缓冲区中是否有足够的空间。另一方面,当你从动态缓冲区读取数据时,你需要负责丢弃(消耗)已读取但不再需要的字节,以确保缓冲区不会永久增长。
我们在“异步TCP服务器”和“进一步学习”课程中简要介绍了Boost.Asio提供的此类缓冲区,即`boost::asio::streambuf`。让我们更仔细地看一下:
从套接字读取数据到动态缓冲区:
#include <boost/asio.hpp>
namespace io = boost::asio;
using tcp = io::ip::tcp;
using error_code = boost::system::error_code;
int main()
{
io::io_context io_context;
// 进行一些初始化
// ...
tcp::socket socket(io_context);