从http流中读取和写入的要求是什么(在boost :: beast中)?

问题描述 投票:2回答:1

我想使用boost :: beast来读取和写入etcd。首先,我希望能够用加速野兽做these examples。它们很容易卷曲。 Etcd可以看作是键/值存储。使用boost::beast client example可以很容易地设置/获取(在示例页面中放置/范围)的功能。没有问题。

但“看”,我不明白。根据docs的观点,手表是一个连续的流,不同于其他会话,这些会话在检索结果后立即死亡。卷曲示例显示在手表仍处于活动状态时更改值和现场响应。我应该使用相同的流来完成与该手表相关的所有操作,包括停止它。

我的问题大致是:如何在boost :: beast中实现这一点?

让我们说从client example I submit ioc.run through a thread

std::thread t(&std::iocontext::run, &ioc);
t.detach();

现在我完全控制主线程中的客户端。我应该创建新的http请求并通过套接字对象在async_write中提交它们吗?但是如果我这样做,我会失去boost :: beast的功能,用很好的http::request<http::string_body>包装http标头。我应该手动创建标头吗?或者我应该发送json与某种线路终结器,以表明消息已结束?通信协议是什么样的?

使用boost :: beast的例子很棒。

c++ boost-asio json-rpc etcd boost-beast
1个回答
1
投票

貌似etcd使用“长时间运行的请求”。为此,你想使用http::read_header [1]或http::async_read_header [2]来获得响应头,然后在循环中使用http::read_some [3]或http::async_read_some [4]来读取响应体的部分。为了干净利落,你想要使用专为此类设计的http::buffer_body [5]。文档中的HTTP Relay示例[6]演示了buffer_body的使用,并且可以适用于处理长时间运行的请求。

[1] https://www.boost.org/doc/libs/1_69_0/libs/beast/doc/html/beast/ref/boost__beast__http__read_header/overload2.html

[2] https://www.boost.org/doc/libs/1_69_0/libs/beast/doc/html/beast/ref/boost__beast__http__async_read_header.html

[3] https://www.boost.org/doc/libs/1_69_0/libs/beast/doc/html/beast/ref/boost__beast__http__read_some/overload2.html

{4] https://www.boost.org/doc/libs/1_69_0/libs/beast/doc/html/beast/ref/boost__beast__http__async_read_some.html

[5] https://www.boost.org/doc/libs/1_69_0/libs/beast/doc/html/beast/ref/boost__beast__http__buffer_body.html

[6] https://www.boost.org/doc/libs/1_69_0/libs/beast/doc/html/beast/more_examples/http_relay.html

© www.soinside.com 2019 - 2024. All rights reserved.