如何获取 beast::flat_buffer 中的数据?

Posted

技术标签:

【中文标题】如何获取 beast::flat_buffer 中的数据?【英文标题】:How can I get the data inside a beast::flat_buffer? 【发布时间】:2021-08-22 15:36:29 【问题描述】:

我正在使用 boost/beast 库连接到 websocket,并将数据写入beast::flat_buffer。我的问题是我无法从buffer 获取数据。我有一个线程安全的channel 对象可以写入,但我不确定如何从buffer 中提取最近收到的消息。

beast::flat_buffer buffer;
// send through socket
send_socket(
   ws, get_subscribe_string(trade_tickers, bar_tickers, quote_tickers));
// read into buffer
while (channel.running) 
   ws.read(buffer); // need to write the most recently received message into the channel

我可以用channel.write(std::string arg) 给频道写信。关于如何从buffer 中提取的任何想法?

【问题讨论】:

【参考方案1】:

flat_buffer 的接口记录在这里:https://www.boost.org/doc/libs/1_77_0/libs/beast/doc/html/beast/ref/boost__beast__flat_buffer.html

如您所见,它是一个丰富的接口,适用于多种不同的使用模式,包括以 FIFO 样式读取和写入块。

现在,如果您使用的是 websockets,那么您的协议已经是面向消息的,而不是面向流的。您可能只想将所有数据作为一个“主体”访问。在我看来,安全、富有表现力和灵活的方法是使用data() 成员。这模拟了一般的Asio Buffer concept,这意味着您可以在其上使用缓冲区迭代器,而无需担心任何缓冲区实现细节:

std::string text(buffers_begin(buffer), buffers_end(buffer));

有关实际使用中的示例(接收 JSON 或 msgpack),请参阅最近的答案:I would like to parse a boost::beast::flat_buffer with msgpack data using nlohmann:json

跳出框框思考

请注意其中的含义:flat_buffer不是强制性的。事实上,这只是对DynamicBuffer concept 建模的一个(简单)实现。

您可以使用任何模型,因此您可以直接接收到字符串中:

std::string str;

auto buf = boost::asio::dynamic_buffer(str);
ws.read(str);

如果您重复使用 str 实例,例如仅仅使用str.clear() 就分配而言可能还不错。

【讨论】:

以上是关于如何获取 beast::flat_buffer 中的数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何获取文章中的图片地址,所有的图片

如何在快速路由器获取请求中从节点获取中使用获取

如何在主函数中获取“语言代码”?

如何获取ListView中某一列的数据

如何获取html中body的值

如何获取UIPickerView中选中的cell的值