Domanda

Sto scrivendo un'applicazione C ++ e vorrei richiedere contemporaneamente più file di dati tramite una richiesta HTTP GET, dove dovrei cercare di iniziare (deve essere multipiattaforma).

  1. Esegui applicazione
  2. Crea un elenco di URL {" http: //host/file1.txt " ;, " ; http: //host/file2.txt " ;, " http: //host/file3.txt "}
  3. Richiedi tutti gli URL contemporaneamente e carica il contenuto in variabili (non vuoi scritture su disco). Ogni file ha circa 10 kB di dati.

Quali librerie mi consigliate di utilizzare? libcurl? curlpp? aumentare asio? avrei bisogno del multi-threading roll-my-own per richiedere tutti i file contemporaneamente? c'è un modo più semplice?

Modifica: dovrò richiedere circa 1000 richieste GET contemporaneamente. Molto probabilmente lo farò in batch (100 alla volta e la creazione di più connessioni man mano che ne viene completata una completata).

È stato utile?

Soluzione

Consiglierei libcurl . Non ne ho molta familiarità, ma ha una multi-interfaccia per eseguire più operazioni HTTP simultanee.

A seconda della soluzione scelta, è possibile eseguire I / O asincroni senza utilizzare il multithreading. La chiave è utilizzare il sistema select (2) chiamata. select () accetta una serie di descrittori di file e ti dice se qualcuno di loro ha dati disponibili. In tal caso, puoi quindi continuare a utilizzare read (2) o recv (2) senza preoccuparti di bloccare.

Altri suggerimenti

I browser Web mantengono spesso un pool di thread di lavoro per eseguire download e assegnano loro i download non appena diventano disponibili. IIRC HTTP RFC ha qualcosa da dire su quante connessioni simultanee dovresti fare allo stesso server contemporaneamente: troppe sono maleducate.

Se molte delle richieste si trovano sullo stesso server e supporta keep-alive (cosa che fanno quasi tutti), allora potrebbe essere un comportamento migliore rispetto allo spamming con più richieste simultanee. L'idea generale è di utilizzare una connessione TCP / IP per più richieste in serie, risparmiando così l'overhead di handshaking. Il risultato pratico, nella mia esperienza nell'implementazione delle classi Java HTTPConnection, è che si introduce un bug sottile che non ha sempre azzerato correttamente lo stato quando si riutilizza la connessione per una nuova richiesta e si trascorre molto tempo a guardare logging / sniffer dati ;-)

libcurl supporta certamente keepalive (abilitato di default, credo).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top