Frage

Ich bin eine C ++ Anwendung zu schreiben und möchte mehrere Datendateien über eine HTTP-GET-Anforderung gleichzeitig beantragen, wo soll ich beginnen aussehen (muss Cross-Plattform sein).

  1. Anwendung ausführen
  2. Erstellen Sie eine Liste von URLs { " http: //host/file1.txt ", „ http: //host/file2.txt “, " http: //host/file3.txt "}
  3. Fordern Sie alle URLs gleichzeitig und um den Inhalt zu Variablen geladen werden (nicht wollen Platte schreibt). Jede Datei hat etwa 10kB von Daten.

Welche Bibliotheken würden Sie empfehlen, ich verwenden? Libcurl? curlpp? steigern Asio? brauche ich, um gleichzeitig zu Roll-my-own Multi-Threading alle Dateien anfordern? gibt es einen einfacheren Weg?

Edit: Ich brauche etwa 1000 GET-Anfragen gleichzeitig beantragen. Wahrscheinlich tue ich dies in den Reihen (100 zu einem Zeitpunkt, und mehr Verbindungen als aus einer Erstellung abgeschlossen sind).

War es hilfreich?

Lösung

Ich würde empfehlen, Libcurl . Ich bin nicht super-vertraut mit ihm, aber es hat ein Multi-Interface für mehrere gleichzeitige HTTP-Operationen durchführen.

Je nachdem, welche Lösung Sie gehen mit, dann ist es möglich, asynchrone I / O zu tun, ohne Multithreading zu verwenden. Der Schlüssel ist die select(2) Systemaufruf zu verwenden. select() nimmt eine Reihe von Datei-Deskriptoren und sagt Ihnen, ob einer von ihnen Daten zur Verfügung haben. Wenn sie das tun, können Sie dann fortfahren read(2) oder recv(2) auf sie zu nutzen, ohne sich Gedanken über zu blockieren.

Andere Tipps

Web-Browser oft einen Pool von Arbeitsthreads halten Downloads zu tun, und weisen Sie Downloads zu ihnen, als sie frei. IIRC die HTTP RFC hat etwas zu sagen, wie viele gleichzeitige Verbindungen, die Sie auf dem gleichen Server zur gleichen Zeit machen sollte. Zuviele ist unhöflich

Wenn mehrere der Anforderungen an denselben Server sind, und es unterstützt Keepalive (was fast jeder tut), dann ist das ein besseres Verhalten kann es mit mehreren gleichzeitigen Anfragen als Spamming. Die allgemeine Idee ist, dass Sie eine TCP / IP-Verbindung für mehrere Anfragen in Serie zu verwenden, damit das Handshake-Overhead zu sparen. Das praktische Ergebnis, nach meiner Erfahrung von Httpconnection-Klassen Java Implementierung ist, dass Sie einen subtilen Fehler einführen mit nicht immer Clearing den Zustand richtig zu tun, wenn Sie die Verbindung für eine neue Anforderung wieder verwenden und viel Zeit verbringen bei Protokollierung / Sniffer starrend Daten; -)

Libcurl sicherlich unterstützt Keep-Alive (standardmäßig aktiviert, glaube ich).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top