我有一个客户,我需要从服务器接收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());
有几件事情我不明白这里:
- 我们完成读标题。 为什么我们需要提高的野兽,无法提振ASIO读取原始TCP消息? 当我试图做到这一点(既async_read / async_read_some)我有无限的读数为零的大小。
- 的文件分析器说(在页面的结尾)是需要一个新的实例为每封邮件,但我没有看到,在示例。
- 由于TCP报文阅读不工作,有没有办法给解析器/串行数据转换为某种字符串? 即使把它写在FIFO方式的文本文件,这样我就可以有一些JSON库处理它? 我不希望使用另一个插座一样的例子。
该功能boost::beast::buffers()
无法编译解析器和串行和解析器没有消费功能,的消耗串行似乎是消息,它将触发如果断言的特定的HTTP部分我这样做对body()
除此之外,我也未能从解析器,并与老派的缓冲区获取数据的一致块std::copy
。 我似乎不知道如何将数据结合在一起获得的数据流。 消耗与缓冲.consume()
在任何点处接收数据时导致need buffer
错误。
我真的很感激有人解释这一切是如何应共同努力的逻辑。