我怎样才能获取beast::flat_buffer内的数据?

Cal*_*n K 4 c++ buffer boost websocket boost-beast-websocket

我正在使用 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
}
Run Code Online (Sandbox Code Playgroud)

我可以使用 向频道写入内容channel.write(std::string arg)。关于如何从中提取任何想法buffer

seh*_*ehe 6

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 概念,这意味着您可以在其上使用 Buffer Iterators,而无需担心任何缓冲区实现细节:

std::string text(buffers_begin(buffer), buffers_end(buffer));
Run Code Online (Sandbox Code Playgroud)

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

创造性思考

但请注意其中的含义:flat_buffer不是强制性的。事实上,它只是对DynamicBuffer 概念进行建模的一种(简单)实现。

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

std::string str;

auto buf = boost::asio::dynamic_buffer(str);
ws.read(str);
Run Code Online (Sandbox Code Playgroud)

如果您重用str实例,例如,仅使用str.clear()它在分配方面可能不错。