2

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

4

1 回答 1

2

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

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

有关实际使用中的示例(接收 JSON 或 msgpack),请参阅最近的答案:我想使用 nlohmann:json 解析带有 msgpack 数据的 boost::beast::flat_buffer

创造性思考

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

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

std::string str;

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

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

于 2021-08-22T20:57:01.813 回答