Question

J'écris une application C ++ et souhaite demander plusieurs fichiers de données via une requête HTTP GET simultanément. Où dois-je chercher pour commencer (doit être multiplate-forme).

  1. Exécuter l'application
  2. Créer une liste d'URL {& http: //hôte/fich1.txt " ;, " ; http: //hôte/file2.txt " ;, " http: //host/file3.txt "}}
  3. Demandez toutes les URL simultanément et chargez le contenu dans des variables (ne souhaitez pas que les écritures sur disque). Chaque fichier contient environ 10 Ko de données.

Quelles bibliothèques recommanderiez-vous d'utiliser? libcurl? curlpp? boost asio? aurais-je besoin de rouler mon propre multi-threading pour demander tous les fichiers simultanément? y a-t-il un moyen plus facile?

Éditer: Je devrai demander environ 1 000 demandes GET simultanément. Très probablement, je le ferai par lots (100 à la fois, et créer plus de connexions à mesure que vous en fassiez une).

Était-ce utile?

La solution

Je recommanderais libcurl . Je ne le connais pas très bien, mais il existe un multi-interface pour effectuer plusieurs opérations HTTP simultanées.

En fonction de la solution choisie, il est possible d'effectuer des E / S asynchrones sans utiliser le multithreading. La solution consiste à utiliser le système select (2) . appel. select () prend un ensemble de descripteurs de fichiers et vous indique si certains d'entre eux disposent de données. Si tel est le cas, vous pouvez alors utiliser read (2) ou recv (2) sans craindre le blocage.

Autres conseils

Les navigateurs Web gèrent souvent un pool de threads de travail pour effectuer des téléchargements et leur attribuent des téléchargements à mesure qu'ils deviennent libres. IIRC the HTTP RFC a son mot à dire sur le nombre de connexions simultanées à établir simultanément sur le même serveur: trop, c’est impoli.

Si plusieurs demandes concernent le même serveur et prend en charge le maintien en activité (ce que presque tout le monde fait), ce comportement peut être préférable à celui de le spammer avec plusieurs demandes simultanées. L'idée générale est que vous utilisez une seule connexion TCP / IP pour plusieurs demandes en série, ce qui vous évite de perdre du temps système. Le résultat pratique, dans mon expérience d'implémentation de classes Java HTTPConnection, est que vous introduisez un bogue subtil qui consiste à ne pas toujours effacer l'état correctement lorsque vous réutilisez la connexion pour une nouvelle requête et à passer un temps considérable à regarder la journalisation / le renifleur. données; -)

libcurl supporte certainement keepalive (activé par défaut, je pense).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top