gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 02:39:54 40 4
gpt4 key购买 nike

我正在使用 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) 写入 channel 。关于如何从 buffer 中提取的任何想法?

最佳答案

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

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

现在,如果您正在使用 websockets,您的协议(protocol)已经是面向消息的,而不是面向流的。您可能只想将所有数据作为一个“主体”访问。在我看来,安全、富有表现力和灵活的方法是使用 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() 可能还不错。

关于c++ - 如何获取 beast::flat_buffer 中的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68882799/

40 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com