如何将 boost::beast 中的序列化数据转换为字符串,以便我可以以 FIFO 方式处理它?

How can I convert serialized data in boost::beast to a string so that I could process it in a FIFO manner?

本文关键字:我可以 FIFO 方式 处理 字符串 转换 beast boost 数据 序列化      更新时间:2023-10-16

我有一个客户端应用程序,我需要从服务器接收http"长时间运行的请求"。我发送一个命令,在获得响应的标头后,我只需要接收以rn分隔的 json 数据,直到连接终止。

我设法调整了 boost 野兽客户端示例来发送消息并接收标头并解析它并接收来自服务器的响应。但是,我未能找到一种序列化数据的方法,以便我可以处理 json 消息。

最接近的问题演示可以在此中继示例中找到。在该示例中(p是解析器,sr是序列化器,input是套接字输入流,output是套接字输出流),在读取 http 标头后,我们有一个从服务器连续读取的循环:

do
{
if(! p.is_done())
{
// Set up the body for writing into our small buffer
p.get().body().data = buf;
p.get().body().size = sizeof(buf);
// Read as much as we can
read(input, buffer, p, ec);
// This error is returned when buffer_body uses up the buffer
if(ec == error::need_buffer)
ec = {};
if(ec)
return;
// Set up the body for reading.
// This is how much was parsed:
p.get().body().size = sizeof(buf) - p.get().body().size;
p.get().body().data = buf;
p.get().body().more = ! p.is_done();
}
else
{
p.get().body().data = nullptr;
p.get().body().size = 0;
}
// Write everything in the buffer (which might be empty)
write(output, sr, ec);
// This error is returned when buffer_body uses up the buffer
if(ec == error::need_buffer)
ec = {};
if(ec)
return;
}
while(! p.is_done() && ! sr.is_done());

这里有几件事我不明白:

  1. 我们已经阅读完了标题。为什么我们需要提升野兽而不是提升 asio 来读取原始 tcp 消息?当我尝试这样做时(同时使用 async_read/async_read_some),我得到了零大小的无限读取。
  2. 解析器的文档说(在页面末尾)每条消息都需要一个新实例,但我在示例中没有看到这一点。
  3. 由于 tcp 消息读取不起作用,有没有办法将解析器/序列化器数据转换为某种字符串?甚至以FIFO方式将其写入文本文件,以便我可以使用一些json库处理它?我不想像示例那样使用另一个套接字。

该函数boost::beast::buffers()无法为解析器和序列化程序编译,并且对于解析器没有消耗函数,序列化程序的消耗似乎是针对消息的特定 http 部分,如果我为body()执行此操作,则会触发断言。

除此之外,我还无法使用老式std::copy从解析器和缓冲区中获取一致的数据块。我似乎不明白如何将数据组合在一起以获得数据流。在接收数据时随时使用.consume()缓冲区都会导致need buffer错误。

我真的很感激有人解释所有这些应该如何协同工作的逻辑。

buf在哪里?您可以直接阅读std::string。调用string.resize(N),并将buffer_body::value_type中的指针和大小设置为string.data()string.size()