试图理解boost :: beast multibuffer

时间:2017-09-09 16:09:46

标签: websocket beast

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

  

该实现使用一个或多个字符数组的序列       各种尺寸。附加其他字符数组对象       适应角色大小变化的顺序       序列。

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

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

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

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

查看sources时,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()) );

任何可以开导我一点的人?

2 个答案:

答案 0 :(得分:8)

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

要求的对象

野兽中的所有动态缓冲区都满足 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

答案 1 :(得分:4)

在最新版本的Beast中,现在有一个函数buffers_to_string可以在一个函数调用中为你完成。