Websocket 试图理解boost::beast多缓冲区

Websocket 试图理解boost::beast多缓冲区,websocket,beast,Websocket,Beast,Beast websocket示例将数据存储在多缓冲区中: 该实现使用一个或多个字符数组的序列 大小不一的。附加的字符数组对象将附加到 用于适应角色大小变化的序列 顺序 当查看界面时,我并不完全清楚它是如何工作的。如果我阅读描述,它可以被看作是一个缓冲区数组。但输出似乎只是一块数据。这是否意味着“一个或多个阵列”仅适用于内部结构 在示例代码中,数据按如下方式读入缓冲区:m_websocketStream.async_read(m_buffer….. 是否每个异步读取操作都会创建一个新的内部缓冲区

Beast websocket示例将数据存储在多缓冲区中:

该实现使用一个或多个字符数组的序列 大小不一的。附加的字符数组对象将附加到 用于适应角色大小变化的序列 顺序

当查看界面时,我并不完全清楚它是如何工作的。如果我阅读描述,它可以被看作是一个缓冲区数组。但输出似乎只是一块数据。这是否意味着“一个或多个阵列”仅适用于内部结构

在示例代码中,数据按如下方式读入缓冲区:
m_websocketStream.async_read(m_buffer…..

是否每个异步读取操作都会创建一个新的内部缓冲区

如果是这种情况,如何在另一端解释它。例如,如何将其读入std::string或std::vector

查找源时,data()返回const_buffer_type,这是一种前向声明

对于数据成员,帮助信息提供了以下信息,这些信息没有多大帮助:

用于将输入序列表示为缓冲区列表的类型。 使用常量缓冲区类型=定义的实现

这个定义似乎来自于包含的头文件boost/asio/buffer.hpp,但是总体结构让我有些困惑

我只是想了解如何将数据处理为字节或转换为std::string

尝试了以下操作,但这也是不允许的:

std::string(boost::asio::buffer\u cast(m\u buffer.data())
,boost::asio::buffer_size(m_buffer.data());

有谁能给我一点启发吗?

data()
返回一个满足ConstBufferSequence()要求的对象。
prepare()
返回一个满足MutableBufferSequence要求的对象

beast中的所有动态缓冲区都满足DynamicBuffer的要求,如中所述

如果要将缓冲区序列转换为字符串,则需要在每个元素上循环,并将其单独附加到字符串中。此类函数可能如下所示:

template<class ConstBufferSequence>
std::string
to_string(ConstBufferSequence const& buffers)
{
    std::string s;
    s.reserve(boost::asio::buffer_size(buffers));
    for(boost::asio::const_buffer b : buffers)
        s.append(boost::asio::buffer_cast<char const*>(b),
            boost::asio::buffer_size(b));
    return s;
}
inline
std::string
to_string(beast::flat_buffer const& buffer)
{
    return std::string(boost::asio::buffer_cast<char const*>(
        beast::buffers_front(buffer.data())),
            boost::asio::buffer_size(buffer.data()));
}

有关缓冲区的更多信息,请参见Beast最新版本中的,现在有一个函数
buffers\u to\u string
,它将在单个函数调用中为您完成此操作。

我认为上一个示例中有一个输入错误。我认为应该是Beast::buffers\u front(…)是的,我将函数重命名为
buffers\u front
,作为一系列更改的一部分,以使所有名称保持一致。我已经编辑了示例代码