【问题标题】:Trying to understand the boost::beast multibuffer试图理解 boost::beast 多缓冲区
【发布时间】:2018-02-18 07:55:15
【问题描述】:

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

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

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

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

每个 async_read 操作是否都会创建一个新的内部缓冲区。

如果是这样,那另一端如何解释。例如。如何将其读入 std::string 或 std::vector。

查看源数据时,data() 返回 const_buffer_type,这是一个前向声明。

对于数据成员,帮助信息提供以下信息,帮助不大:

用于将输入序列表示为缓冲区列表的类型。 使用 const_buffers_type = implementation_defined;

定义似乎来自包含的头文件 boost/asio/buffer.hpp。然而,整体结构对我来说有点令人困惑。

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

尝试了以下方法,但这也是不允许的:

std::string( boost::asio::buffer_cast<const char*>(m_buffer.data()) ,boost::asio::buffer_size(m_buffer.data()) );

谁能给我一点启示?

【问题讨论】:

    标签: c++ websocket beast


    【解决方案1】:

    data() 返回一个满足 ConstBufferSequence (http://www.boost.org/doc/libs/1_65_0/doc/html/boost_asio/reference/ConstBufferSequence.html) 要求的对象。 prepare() 返回一个满足 MutableBufferSequence 要求的对象 (http://www.boost.org/doc/libs/1_65_0/doc/html/boost_asio/reference/MutableBufferSequence.html)

    beast 中的所有动态缓冲区都满足 DynamicBuffer 的要求,详见http://www.boost.org/doc/libs/develop/libs/beast/doc/html/beast/concepts/DynamicBuffer.html

    如果要将缓冲区序列转换为字符串,则需要遍历每个元素并将其单独附加到字符串中。这样的函数可能如下所示:

    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;
    }
    

    或者,如果您想避免缓冲区复制,您可以使用beast::flat_buffer 之类的东西,它保证所有缓冲区序列的长度都为 1。像这样的:

    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()));
    }
    

    有关缓冲区的更多信息,请参阅http://www.boost.org/doc/libs/1_65_0/doc/html/boost_asio/overview/core/buffers.html

    【讨论】:

    • 我认为最后一个示例中有错字。我认为应该是 beast::buffers_front(...)
    • 是的,我将函数重命名为 buffers_front 作为一组更改的一部分,以使所有名称保持一致。我已经编辑了示例代码
    【解决方案2】:

    在最新版本的 Beast 中,现在有函数 buffers_to_string 将在单个函数调用中为您完成此操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-31
      • 1970-01-01
      • 1970-01-01
      • 2014-12-09
      • 2017-10-25
      • 2013-01-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多