Los rincones del API Win32: Más sobre WinInet y HTTP - Jugando con el puntero del recurso
27 de Agosto de 2005
Programación estructurada
El método más sencillo, y menos eficiente, es a través de la función InternetSetFilePointer, que ya explicamos en nuestro anterior artículo∞. Con esta función, conseguimos situar el puntero del archivo en una posición concreta, con lo que conseguiremos que las llamadas a InternetReadFile hagan la lectura a partir de la posición en que hemos situado el puntero. Con esto podemos descargar un rango determinado, por ejemplo:{
se abre la instancia de internet
HINTERNET hInet = ::InternetOpen("Descarga segmentada",
INTERNET_OPEN_TYPE_PRECONFIG,
NULL, NULL, );
se abre la URL, enviando también las cabeceras adicionales
HINTERNET hReq = ::InternetOpenUrl(hInet,
"http://www.servidor.com/recurso.zip"∞,
NULL, , INTERNET_FLAG_RELOAD, );
almaceno en una variable el límite inferior del rango
DWORD byteIni = 512;
situamos el puntero en el byte 512
::InternetSetFilePointer(hReq, byteIni, NULL, FILE_BEGIN, );
... lectura (a partir del byte 512) del recurso
con InternetReadFile
::InternetCloseHandle(hReq);
::InternetCloseHandle(hInet);
}
Este sistema, aunque es muy sencillo de utilizar, tiene dos serios problemas:
Para solucionar estos problemas, que son bastante graves, nos tenemos que apoyar en una nueva característica del protocolo HTTP, introducida en la versión 1.1: los rangos.
Este sistema, aunque es muy sencillo de utilizar, tiene dos serios problemas:
- Para utilizar esta función es necesario que para la descarga se esté utilizando el caché de WinInet, ya que, en realidad, el desplazamiento del puntero se hace sobre el fichero local almacenado en el caché, y no de forma remota como podría parecer. Si estamos descargando archivos grandes (y precisamente para eso queremos la descarga segmentada), el caché contendrá una copia del archivo completo, por lo que puede ser un gran desperdicio de espacio.
- Como ya hemos dicho, la función InternetSetFilePointer en realidad lo que mueve es el puntero del archivo local almacenado en el caché de WinInet. Esto implica que, en realidad, existirá un único puntero por cada proceso, por lo que, si distintos hilos de ejecución utilizan este puntero, unos hilos estarán modificando el puntero de los otros. En resumen: no es posible utilizar esta función desde aplicaciones multi-hilo. Como dijimos anteriormente, un escenario habitual en las descargas segmentadas es utilizar varios hilos de ejecución para descargar cada uno de los segmentos, y como vemos, esto no es posible con InternetSetFilePointer.
Para solucionar estos problemas, que son bastante graves, nos tenemos que apoyar en una nueva característica del protocolo HTTP, introducida en la versión 1.1: los rangos.
Valora este capítulo:
Autor y licencia de 'Los rincones del API Win32: Más sobre WinInet y HTTP - Jugando con el puntero del recurso'
|
Opiniona sobre 'Los rincones del API Win32: Más sobre WinInet y HTTP - Jugando con el puntero del recurso' (0)
Tu nombre debe tener tres caracteres como mínimo.
Es necesario que te des de alta con una cuenta de correo válida.
Es necesario que te des de alta con una cuenta de correo válida.
El contenido del título de tu opinión debe tener tres caracteres como mínimo.
Es obligatorio que selecciones una valoración del recurso.
El contenido del comentario de tu opinión debe tener tres caracteres como mínimo.
Opina sobre este tutorial |
Wikis relacionados con 'Los rincones del API Win32: Más sobre WinInet y HTTP - Jugando con el puntero del recurso'
Entramos en temas interesantes: el acceso a recursos remotos a través del protocolo de aplicación...
Más »
El protocolo FTP desde el API WinInet. Con este curso aprenderás a hacer un pequeño...
Más »
Comienzo con un nuevo tema dentro dentro de la serie Los rincones del API Win32....
Más »
Damos una visión detallada de una de las características más interesantes de esta tecnología de...
Más »
Estudio sobre la doctrina católica.


