C ++同時GETリクエスト
-
03-07-2019 - |
質問
C ++アプリケーションを書いていますが、HTTP GETリクエストで複数のデータファイルを同時にリクエストしたいのですが、どこから始めればよいのでしょうか(クロスプラットフォームである必要があります)。
- アプリケーションの実行
- URLのリストを作成{" http://host/file1.txt "、&quot ; http://host/file2.txt "、" http://host/file3.txt "}
- すべてのURLを同時に要求し、コンテンツを変数にロードします(ディスクへの書き込みを望まない)。各ファイルには約10kBのデータがあります。
どのライブラリを使用することをお勧めしますか? libcurl? curlpp? asioをブーストしますか?すべてのファイルを同時に要求するには、自分のマルチスレッドをロールバックする必要がありますか?もっと簡単な方法はありますか?
編集:約1000件のGETリクエストを同時にリクエストする必要があります。ほとんどの場合、これをバッチで実行します(一度に100個、接続が完了するとさらに接続を作成します)。
解決
libcurl をお勧めします。私はこれにはあまり慣れていませんが、マルチインターフェースを持っています複数のHTTP操作を同時に実行します。
使用するソリューションに応じて、マルチスレッドを使用せずに非同期I / Oを実行できます。重要なのは、 select(2)
システムを使用することですコール。 select()
は一連のファイル記述子を取り、それらのいずれかが使用可能なデータを持っているかどうかを通知します。その場合は、ブロックを心配することなく、それらに対して read(2)
または recv(2)
を使用できます。
他のヒント
Webブラウザーは、ダウンロードを行うためにワーカースレッドのプールを維持し、フリーになるとダウンロードを割り当てます。 IIRCのHTTP RFCには、同じサーバーに対して同時にいくつの同時接続を行う必要があるかについての説明があります。多すぎると失礼になります。
複数のリクエストが同じサーバーに対するものであり、キープアライブをサポートしている場合(ほぼ全員がサポートしている場合)、複数のリクエストを同時に送信するよりも優れた動作になる可能性があります。一般的な考え方は、連続した複数の要求に対して1つのTCP / IP接続を使用して、ハンドシェイクのオーバーヘッドを節約することです。 Java HTTPConnectionクラスを実装した私の経験では、実際の結果は、新しいリクエストのために接続を再利用するときに常に状態を正しくクリアせず、ロギング/スニファーを見つめるのにかなりの時間を費やす微妙なバグを導入することですデータ;-)
libcurlは確かにキープアライブをサポートしています(デフォルトで有効になっていると思います)。