2009-04-30 14 views
2

私はC++アプリケーションを作成しており、HTTP GETリクエストを介して複数のデータファイルを同時に要求したいと考えています(クロスプラットフォームにする必要があります)。C++ Concurrent GET requests

  1. アプリケーションの実行
  2. のURL {「http://host/file1.txt」、「http://host/file2.txt」、「http://host/file3.txt」}のリストを作成します
  3. 要求を同時にすべてのURLと変数に内容をロード(ディスク書き込みをしたくありません)。各ファイルには約10kBのデータがあります。

私はどのライブラリを使用することをおすすめしますか? libcurl?カレル?ブーストasio?すべてのファイルを同時に要求するには、私自身のマルチスレッドをロールバックする必要がありますか?簡単な方法はありますか?

編集:1000件のGETリクエストを同時にリクエストする必要があります。おそらく、私はバッチでこれを行うでしょう(一度に100、完了したとしてより多くの接続を作成する)。

+0

なぜファイルを並行して要求する必要がありますか? URLのリストが非常に大きい場合を除いて、10kBのサイズであれば目立たない遅延は発生しません。同時実行性は、実装が疑わしい利益のためにはるかに複雑になります。 – lothar

+0

各getを実行するために100msの待ち時間があり、10個のファイルがある場合、並列取得は1000msではなく100msで終了します。 –

+0

@lothar ええ、URLリストは本当にかなり(10-1000s時)、私は説明の容易さのために説明の3つのURLにそれを保ったかなり長いです。 GETリクエストには高いレイテンシがありますが、ストリーミングを開始するとすぐに速くなります(レイテンシが問題になります)。したがって、同時実行性が必要になります。 –

答えて

4

私はlibcurlをお勧めします。私はそれに精通していませんが、同時に複数のHTTP操作を実行するためのmulti-interfaceがあります。

どのような解決方法があるかによって、マルチスレッドを使用せずに非同期I/Oを実行することができます。鍵はselect(2)システムコールを使用することです。 select()は一連のファイル記述子を取得し、使用可能なデータがあるかどうかを示します。そうした場合、ブロックすることを心配することなく、read(2)またはrecv(2)を使用して進むことができます。

2

Webブラウザでは、ダウンロードを行うワーカースレッドのプールが頻繁に維持され、空きになったときにダウンロードが割り当てられます。 IIRCのHTTP RFCには、同時に同じサーバに同時に接続するコネクションの数についての記述があります。あまりにも多くが失礼です。

複数のリクエストが同じサーバーにあり、キープアライブをサポートしている場合(ほとんどの人がそうしています)、複数の同時リクエストでスパムするよりも優れた動作です。一般的な考え方では、複数の要求に対して1つのTCP/IP接続を連続して使用するため、ハンドシェイクのオーバーヘッドが節約されます。 Java HTTPConnectionクラスを実装した私の経験では、実際には、新しいリクエストに対して接続を再利用するときに常に状態を正しくクリアするわけではない微妙なバグを導入して、ロギング/スニファでかなりの時間を費やしていますデータ;-)

libcurlは確実にキープアライブをサポートしています(デフォルトでは有効になっています)。

+0

これは実際に私たちのLAN内のいくつかのサーバー間で通信するためのものですので、失礼なのは間違いありません:) 接続の再利用についての良い考え方。 –