ブースト::ビーストを使用してetcdの読み取りと書き込みを行いたいと思います。まず、ブーストビーストでこれらの例を実行できるようにしたいと思います。それらはカールで簡単に実行できます。Etcdは、キー/値ストアと見なすことができます。設定/取得する関数(例ページのput / range)は、boost :: beastクライアントの例で簡単に実行できます。そこに問題はありません。
でも「見て」、わかりません。ドキュメントによると、ウォッチは継続的なストリームであり、結果を取得した直後に終了するセッションである他のストリームとは異なります。カールの例は、時計がまだアクティブな間に値と応答をその場で変更することを示しています。同じストリームを使用して、時計の停止を含め、その時計に関連するすべてのことを行う必要があります。
私の質問は広く:これをboost :: beastに実装するにはどうすればよいですか?
さんからと言ってみましょうクライアントの例私は提出するioc.run
スレッドを通じて付き
std::thread t(&std::iocontext::run, &ioc);
t.detach();
これで、メインスレッドでクライアントを完全に制御できるようになりました。新しいhttpリクエストを作成async_write
し、ソケットオブジェクトを介して送信することになっていますか?しかし、そうすると、httpヘッダーをniceでラップすることでboost :: beastの機能が失われますhttp::request<http::string_body>
。ヘッダーを手動で作成する必要がありますか?それとも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リレーの例[6]は、の使用法を示しており、buffer_body
長時間実行されるリクエストを処理するように適合させることができます。
[6] https://www.boost.org/doc/libs/1_69_0/libs/beast/doc/html/beast/more_examples/http_relay.html
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加