Los rincones del API Win32: Más sobre WinInet y HTTP - Jugando con el puntero del recurso

14 - Jugando con el puntero del recurso

[editar]
Tutorial creado por Juan Manuel. Extraido de: http://www.lawebdejm.com
30 de Noviembre de 1999
El método más sencillo, y menos eficiente, es a través de la función InternetSetFilePointer, que ya explicamos en nuestro . 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:

  1. 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.
  2. 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.
[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.