Pregunta

Estoy escribiendo una aplicación de C ++ y me gustaría solicitar varios archivos de datos a través de una solicitud HTTP GET de forma simultánea, donde debo buscar para comenzar (debe ser multiplataforma).

  1. Ejecutar aplicación
  2. Cree una lista de URL {" http: //host/file1.txt " ;, " ; http: //host/file2.txt " ;, " http: //host/file3.txt "}
  3. Solicite todos los URL simultáneamente y cargue los contenidos a las variables (no desea escrituras en el disco). Cada archivo tiene unos 10kB de datos.

¿Qué bibliotecas me recomendarías usar? libcurl? rizo? impulsar asio? ¿Necesitaré enrollar mis propios subprocesos para solicitar todos los archivos simultáneamente? ¿Hay alguna forma más fácil?

Editar: necesitaré solicitar alrededor de 1000 solicitudes GET simultáneamente. Lo más probable es que lo haga en lotes (100 a la vez, y la creación de más conexiones a medida que se complete una).

¿Fue útil?

Solución

Recomendaría libcurl . No estoy muy familiarizado con él, pero tiene un interfaz múltiple para realizar múltiples operaciones HTTP simultáneas.

Dependiendo de la solución con la que vaya, es posible hacer E / S asíncronas sin utilizar multihilo. La clave es utilizar el sistema select (2) llamada. select () toma un conjunto de descriptores de archivos y le dice si alguno de ellos tiene datos disponibles. Si lo hacen, entonces puede proceder a usar read (2) o recv (2) en ellos sin preocuparse por el bloqueo.

Otros consejos

Los navegadores web a menudo mantienen un grupo de subprocesos de trabajo para realizar descargas y asignarles descargas a medida que se convierten en gratuitas. IIRC el HTTP RFC tiene algo que decir acerca de cuántas conexiones simultáneas debe hacer al mismo servidor al mismo tiempo: demasiadas es grosera.

Si varias de las solicitudes se envían al mismo servidor y es compatible con keep-alive (lo que hacen casi todos), puede ser un mejor comportamiento que enviar correo no deseado con múltiples solicitudes simultáneas. La idea general es que utiliza una conexión TCP / IP para múltiples solicitudes en serie, ahorrando así la sobrecarga de handshaking. El resultado práctico, en mi experiencia de implementación de clases Java HTTP de conexión, es que introduce un error sutil para hacer que no siempre se borre el estado correctamente cuando se reutiliza la conexión para una nueva solicitud y se pasa un tiempo considerable en iniciar el registro / rastreador datos ;-)

libcurl ciertamente admite keepalive (habilitado de forma predeterminada, creo).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top