如何获取 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 中的数据?的主要内容,如果未能解决你的问题,请参考以下文章