我想使用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的例子很棒。
貌似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
的使用,并且可以适用于处理长时间运行的请求。
[6] https://www.boost.org/doc/libs/1_69_0/libs/beast/doc/html/beast/more_examples/http_relay.html