Beast websocket示例将数据存储在多缓冲区中:
该实现使用一个或多个不同大小的字符数组的序列.附加的字符数组对象附加到序列以适应字符序列大小的变化.
在查看界面时,我并不完全清楚它是如何工作的.如果我读了描述,它可以看作是一个缓冲区数组.但似乎输出只是一大块数据.这是否意味着"一个或多个阵列"仅适用于内部结构?
在示例代码中,数据被读入缓冲区,如下所示: m_websocketStream.async_read(m_buffer.....
每个async_read操作都会创建一个新的内部缓冲区.
如果是这种情况,如何在另一端解释它.EG如何将其读入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()) );
有人能开导我一点吗?
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;
}
Run Code Online (Sandbox Code Playgroud)
或者,如果要避免使用缓冲区副本,可以使用类似的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()));
}
Run Code Online (Sandbox Code Playgroud)
有关缓冲区的更多信息,请参阅http://www.boost.org/doc/libs/1_65_0/doc/html/boost_asio/overview/core/buffers.html
| 归档时间: |
|
| 查看次数: |
2257 次 |
| 最近记录: |