如何获取 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()
可能还不错。
我正在使用 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()
可能还不错。