16 - Reanudar la descarga

[editar]
Tutorial creado por Juan Manuel. Extraido de: http://www.lawebdejm.com
30 de Noviembre de 1999
Como ya hemos visto, una de las características propias de un gestor de descarga, es el dividir el archivo remoto en segmentos, y descargarlos de forma simultanea, utilizando múltiples hilos o cualquier otro sistema de multi-proceso. Sin embargo, hay otra característica que puede resultar igual o más interesante: la reanudación de la descarga.

Cuando estamos descargando un recurso grande, lo más habitual es detener la descarga en un momento dado, para continuarla más tarde en el punto en que fue detenida. Para ello, podemos utilizar la técnica de descargas segmentadas, del siguiente modo: cuando se está descargando el archivo (es decir: dentro del bucle de InternetReadFile) debemos mantener en todo momento el números bytes que hemos descargado. En el momento en que el usuario cancele el proceso de descarga, guardaremos ese dato (el número de bytes descargados) en un archivo (ya sea un archivo INI, el registro de Windows o cualquier otro tipo de archivo). Cuando intentemos reanudar la descarga en el punto en que lo dejamos, debemos leer el número de bytes que habíamos almacenado, y descargar desde esa posición hasta el final, a través de un rango.

Pongamos un ejemplo: supongamos que estamos descargando un recurso de 500 KB (512.000 bytes). Nuestro programa comienza a descargar, y el usuario pulsa el botón "Cancelar" cuando se vamos por el byte 150.272. En ese momento, guardamos este valor en un archivo INI y terminamos el proceso de descarga, informando al usuario de que la descarga se ha cancelado y se reanudará en el mismo punto. Cuando el usuario vuelva a iniciar la descarga, definiremos un rango a partir del byte 150.272 hasta el final, con la siguiente petición GET:

|| GET /recurso.zip HTTP/1.1 ||
|| Accept: text/html ||
|| Range: bytes=150272- ||
||   ||

El proceso de descarga continuará a partir del punto en que lo hemos dejado, aunque tenemos que tener cuidado de añadir (y no sobrescribir) al archivo destino los nuevos datos. Si el usuario cancela de nuevo el proceso, digamos en el byte 252.672, realizaremos el mismo proceso.

Para combinar los dos técnicas (descarga segmentada y reanudación), debemos mantener en el archivo toda la información de los rangos, y la posición de cada uno de ellos en que hemos detenido la descarga.

Atención:
Microsoft no garantiza el funcionamiento correcto de la cabecera “Range” utilizada desde WinInet. De hecho, si leemos varios mensajes de las news de WinInet, veremos que los propios empleados de soporte de Microsoft avisan de que la cabecera “Range” no funciona correctamente desde WinInet.
En las pruebas que he podido hacer para una descarga segmentada, la función HttpSendRequest se queda colgada cuando es llamada para enviar la petición del tercer segmento.
Sin embargo, lo que si funciona es el uso de los rangos para reanudar las descargas, ya que en este caso no se envía más de una petición a la vez.
Es una verdadera lástima que WinInet tenga todavía este tipo de errores, ya que en esta ocasión, si queremos desarrollar un gestor de descargas que soporte descargas segmentadas, debemos hacer uso de otras tecnologías, como WinSock en el mundo de Microsoft.
[editar]

1 opinión

esta chido

esta de poca aunke no le entendi jajajajaja

Tutoriales relacionados con 'Los rincones del API Win32: Más sobre WinInet y HTTP'

El protocolo FTP desde el API WinInet. Con este curso aprenderás a hacer un pequeño... Más »

Autor y licencia de 'Los rincones del API Win32: Más sobre WinInet y HTTP'


Tutorial de Juan Manuel. Extraido de: http://www.lawebdejm.com CopyLeft
Este contenido ha sido recopilado por el equipo de Wikilearning. Todo el contenido recopilado se ha obtenido respetando y comunicando en nuestro site la licencia de cada fuente.
Wikilearning tiene permiso expreso por escrito de los autores para publicar los contenidos que ha extraído de otras webs, incluyendo su uso comercial.