Descargar archivos usando C++

  • 2 Respuestas
  • 1247 Vistas

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado d3adly

  • *
  • Underc0der
  • Mensajes: 90
  • Actividad:
    0%
  • Country: 00
  • Reputación 5
    • Ver Perfil
    • sh1tty c0d3
    • Email

Descargar archivos usando C++

  • en: Junio 05, 2020, 01:21:04 am
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) You are not allowed to view links. Register or Login
GET /descargas/archivos/archivo.zip HTTP/1.1
Host: www.website.com
User-Agent: Juanker v2
La primera linea contiene el comando GET(You are not allowed to view links. Register or Login), 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(You are not allowed to view links. Register or Login) 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) You are not allowed to view links. Register or Login
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) You are not allowed to view links. Register or Login
HTTP/1.1 200 OKEl 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 You are not allowed to view links. Register or Login. Los siguientes campos muestran informacion del sevidor como:
Fecha
Código: (text) You are not allowed to view links. Register or Login
Date: Sat, 09 Dec 2025 03:10:00 GMT
Version de servidor
Código: (text) You are not allowed to view links. Register or Login
Server: Apache/2.4.29 (Ubuntu)
Tambien informacion del recurso solicitado /descargas/archivos/archivo.zip
Tamaño en bytes
Código: (text) You are not allowed to view links. Register or Login
Content-Length: 80160806Tipo de recurso
Código: (text) You are not allowed to view links. Register or Login
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) You are not allowed to view links. Register or Login
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 You are not allowed to view links. Register or Login

Para armar el paquete usando codigo se podria realizar asi:
Código: (cpp) You are not allowed to view links. Register or Login
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 You are not allowed to view links. Register or Login

Como usarlo?
Código: (cpp) You are not allowed to view links. Register or Login
//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 You are not allowed to view links. Register or Login, 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.
« Última modificación: Junio 05, 2020, 01:42:19 am por d3adly »
Ph'nglui mglw'nafh Cthulhu R'lyeh wgah'nagl fhtagn

Desconectado Gabriela

  • *
  • Co Admin
  • Mensajes: 1009
  • Actividad:
    0%
  • Country: 00
  • Reputación 22
  • A las personas se las conoce por sus heridas...
    • Ver Perfil
    • Hirana: red de IRC
    • Email

Re:Descargar archivos usando C++

  • en: Junio 05, 2020, 02:54:02 am
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
« Última modificación: Junio 05, 2020, 03:06:01 am por 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.

Desconectado d3adly

  • *
  • Underc0der
  • Mensajes: 90
  • Actividad:
    0%
  • Country: 00
  • Reputación 5
    • Ver Perfil
    • sh1tty c0d3
    • Email

Re:Descargar archivos usando C++

  • en: Junio 05, 2020, 03:00:30 am
You are not allowed to view links. Register or Login
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 @You are not allowed to view links. Register or Login esa era la idea.
Ph'nglui mglw'nafh Cthulhu R'lyeh wgah'nagl fhtagn