Descargar archivos usando C++

Iniciado por d3adly, Junio 05, 2020, 01:21:04 AM

Tema anterior - Siguiente tema

0 Miembros y 2 Visitantes están viendo este tema.

Junio 05, 2020, 01:21:04 AM Ultima modificación: Junio 05, 2020, 01:42:19 AM por d3adly
Hola comunidad, hoy les comparto mi clase con el cual podran descargar archivos desde C++.

Primero un poco de teoria:

El proceso que realiza un programa normal como un navegador web (firefox, chrome, etc...) para descargar un archivo es el siguiente:

  • Envia un paquete con la ruta del archivo deseado en cuestion
  • Recibe la respuesta del servidor el cual contiene la informacion del archivo, como el tamaño y tipo de archivo entre otra informacion
  • Continua leyendo del socket hasta que no se encuentren mas bytes para leer o logre el tamaño del archivo

El paquete enviando por el navegador puede ser parecido a este:
Código: text

GET /descargas/archivos/archivo.zip HTTP/1.1
Host: www.website.com
User-Agent: Juanker v2

La primera linea contiene el comando GET(No tienes permitido ver los links. Registrarse o Entrar a mi cuenta), usado para obtener datos del recurso especificado, en este caso:
          /descargas/archivos/archivo.zip
Seguido de HTTP/1.1 que es la version de HTTP a usar en la comunicacion. Luego cada dato enviado al servidor va en este formato:
Campo : Valor
El campo Host lleva el nombre de dominio al cual se desea enviar la peticion. Este campo es muy util en servidores que almacenan multiples dominios, logrando asi identificar a cual dominio virtual(No tienes permitido ver los links. Registrarse o Entrar a mi cuenta) pertenece la peticion enviada por el navegador.
Y el campo User-Agent, aloja el nombre del navegador y otra informacion del mismo, ejemplo:
Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0

Despues de enviar el paquete recibiria una respuesta parecida a esta:
Código: text

HTTP/1.1 200 OK
Date: Sat, 09 Dec 2025 03:10:00 GMT
Server: Apache/2.4.29 (Ubuntu)
Content-Length: 80160806
Content-Type: application/zip


Siendo la primer linea:
Código: text
HTTP/1.1 200 OK

El codigo de respuesta de la ultima peticion, en este caso 200, significa que la peticion fue aceptada, he aqui una lista de los codigos que puede retornar un servidor http No tienes permitido ver los links. Registrarse o Entrar a mi cuenta. Los siguientes campos muestran informacion del sevidor como:
Fecha
Código: text
Date: Sat, 09 Dec 2025 03:10:00 GMT

Version de servidor
Código: text
Server: Apache/2.4.29 (Ubuntu)


Tambien informacion del recurso solicitado /descargas/archivos/archivo.zip
Tamaño en bytes
Código: text
Content-Length: 80160806

Tipo de recurso
Código: text
Content-Type: application/zip


A esta respuesta del servidor se le conoce como Cabecera o Headers, seguido de esta informacion sigue el contenido del archivo solicitado en cuestion. Un ejemplo sencillo seria solicitar un archivo de texto plano /descargas/archivos/archivo.txt, se recibe una respuesta como esta:
Código: text
HTTP/1.1 200 OK
Date: Sat, 09 Dec 2025 03:10:00 GMT
Server: Apache/2.4.29 (Ubuntu)
Content-Length: 86
Content-type: text/plain

Este es un archivo de texto
que contiene varias lineas
informacion y mas information

Nota que esta vez el campo Content-type cambio a text/plain ya que este es el tipo de archivo que se ha solicitado. Extensiones MIME No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Para armar el paquete usando codigo se podria realizar asi:
Código: cpp

char Packet[] = "GET /descargas/archivos/archivo.zip HTTP/1.1\r\n"\
                "Host: www.website.com\r\n"\
                "User-Agent: Juanker v2\r\n\r\n";


El \r\n al final de cada linea(a excepcion de la ultima que contiene \r\n\r\n) es requerido en cada paquete HTTP que se envia o recibe usando este protocolo.
\r (Carriage Return), es un control de caracter usado para resetear la posicion del dispositivo al inicio de la linea de texto, \n (New Line), es un caracter usado para indicar el final de la linea actual e iniciar una nueva. El contenido del archivo que hemos solicitado al sevidor viene seguido de los ultimos 4 caracteres (\r \n \r \n).

Resumiendo, el navegador envia la peticion y recibe la respuesta con los datos del archivo solicitado y empieza a escribir al archivo todo lo que reciba despues de (\r \n \r \n).

El proyecto No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Como usarlo?
Código: cpp

//Se crea el objeto
Downloader down;
//Llamada a la funcion Download con la url como parametro
if(down.Download("http://www.website.com/ruta/al/fichero.rar"){
std::cout<<"Descarga satisfactoria\n";
}

La clase Downloader realiza toda la "magia", se crea un nuevo objeto y se llama la funcion Download que recibe como parametro la url del archivo a descargar, el puerto puede ir junto con la url No tienes permitido ver los links. Registrarse o Entrar a mi cuenta, tambien sigue redirecciones y hace uso de openssl para realizar descargas de servidores que utilizen SSL, sigo mejorandola y cualquier comentario es bien apreciado.
Tambien trae una barra de carga  ;D.
Ph'nglui mglw'nafh Cthulhu R'lyeh wgah'nagl fhtagn

Junio 05, 2020, 02:54:02 AM #1 Ultima modificación: Junio 05, 2020, 03:06:01 AM por Gabriela
Tu post:

Sencillo y muy claro de entender.
Idóneo para aprender, desde un marco teórico documentado, y con un código práctico, de fácil lectura.

Excelente aporte, como otros que nos has dejado.

Gabriela
Tú te enamoraste de mi valentía, yo me enamoré de tu oscuridad; tú aprendiste a vencer tus miedos, yo aprendí a no perderme en tu abismo.

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Sencillo y muy claro de entender.
Idóneo para aprender, desde un marco teórico documentado, y con el código práctico, de fácil lectura.

Gracias @No tienes permitido ver los links. Registrarse o Entrar a mi cuenta esa era la idea.
Ph'nglui mglw'nafh Cthulhu R'lyeh wgah'nagl fhtagn