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

How can I get the data inside a beast::flat_buffer?

我正在使用 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?

中提取的任何想法

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),请参阅最近的回答:

跳出框框思考

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

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

std::string str;

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

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