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
?
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()
它在分配方面可能不错。
归档时间: |
|
查看次数: |
3819 次 |
最近记录: |