gpt4 book ai didi

c++ - 试图理解 boost::beast multibuffer

转载 作者:行者123 更新时间:2023-12-02 22:39:41 28 4
gpt4 key购买 nike

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

The implementation uses a sequence of one or more character arrays of varying sizes. Additional character array objects are appended to the sequence to accommodate changes in the size of the character sequence.

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

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

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

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

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

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

The type used to represent the input sequence as a list of buffers. using 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()) );

有谁可以给​​我一点启发吗?

最佳答案

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 的东西,它保证所有缓冲区序列的长度均为一。像这样的事情:

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

关于c++ - 试图理解 boost::beast multibuffer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46132570/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com