我怎样才能在升压转换兽串行数据::为一个字符串,这样我可以在FIFO方式处理它?(How can I

2019-09-27 17:42发布

我有一个客户,我需要从服务器接收HTTP“长时间运行的请求”的应用。 我发送一个命令,并获取响应的头后,我必须只接收由分离JSON数据\r\n ,直到连接被终止。

我设法适应升压兽客户端的例子来发送消息和接收头,并分析它,并接收来自服务器的响应。 然而,我在寻找一种方法来序列化数据,这样我可以处理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错误。

我真的很感激有人解释这一切是如何应共同努力的逻辑。

Answer 1:

哪里buf ? 你可以直接读入std::string代替。 调用string.resize(N)并设置指针和尺寸在buffer_body::value_typestring.data()string.size()



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