Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Lectura De Ficheros En Internet

Iniciado por fiero, 16 de Julio de 2004, 10:16:59 AM

« anterior - próximo »

fiero

 ¿Alguien ha utilizado alguna vez las funciones de las MFC para acceso a Internet?

Se trata de las clases CInternetSession y CHttpFile que utilizo para leer un fichero de internet. Tengo un problema con el Seek. Al mover el puntero del fichero, me lo mueve, pero al leer, no comienza en la posición donde lo mueves, sino que lee todo el fichero hasta llegar a esa posición.

O, si no se puede solucionar, me interesa como se hace el file.Read con sockets. He buscado por ahí, pero hay mucha información de como hacer un cliente-servidor, y ninguna sobre como de pide un fichero por http y se lee.

un saludo
www.videopanoramas.com Videopanoramas 3D player

ethernet

 GET /path/file.ext

el encabezado http tiene mas opciones pero basicamente eso es suficiente. Para pillar el archivo a partir de un byte determinado yo miraría como lo hace wget (tienes el code por ahi). Otra herramienta que te puede ser util es netcat para hacer pruebas :)



un saludo

shephiroth

 Muy buenas.

Realmente no se para q lo necesitas, ni si te servirá, pero yo q haría sería volcar todo e archivo al disco duro, y luego trabajarlo como un archivo local.....despues ya eliminar el archivo......

Si necesitas trabajar directamente con el archivo mira a ver si en msdn encuentras información, creo que cuando busque informacion para hacer una palicacion servidor, un cliente, y conectarlos por socket di por error con la informacion que necesitas. Explicaba como trabajar con esas dos funciones q nos dices.

P.D: Remito al msdn pq vi infomacion y no se del tema.

Zaelsius

 Me quedo con la propuesta de ethy :-* . El protocolo HTTP es bastante sencillo, hay muchos ejemplos y documentación en la red. Y al igual que ha dicho ya, te basta el netcat para hacer las primeras pruebas. El netcat es una sencilla herramienta de línea de comandos, que permite realizar distintas tareas, como conectarse a un servidor y enviar texto, o escuchar conexiones entrantes.. por algo la llaman la "navaja suiza" de los hackers  B)

Aquí tienes un bonito PDF sobre HTTP de mi uni con lo básico para empezar:
http://www.dccia.ua.es/dccia/inf/asignatur...terial/http.pdf

fiero

 Vale, pues voy a ver si me pongo con los sockets y consigo hacerlo. Que no tengo ni idea, pero ya es hora de ponerse...

[shephiroth]
Sí, la msdn ya me la he mirado de cabo a rabo, pero no pone nada del asunto. Resulta que tampoco quiero descargar todo el fichero, es por eso por lo que lo hago. Imagina que tengo una imagen de 10MB en el servidor, pero yo la quiero cargar gradualmente, y al principio no quiero usar más que la segunda mitad. Pues hago un CHttpFile->Seek a la mitad del  fichero, y comienzo a leer. Pues resulta que la función se queda bloqueada en CHttpFile->Read leyendo los primeros 5 MB hasta que le llegan los siguientes 5Mb que le he pedido. O sea, que el CHttpFile->Seek no me ha servido de nada.

gracias por las respuestas :)
un saludo
www.videopanoramas.com Videopanoramas 3D player

Mars Attacks

 Pero si esa tontería la hace mi práctica de sockets... no es nada complicado :)

Juan Mellado

 fiero,
puedes utilizar la función HttpAddRequestHeaders() de WinInet para añadir una cabecera HTTP 'Range' y pedir un rango de bytes determinado, en vez de utilizar la función Seek que tiene el problema que comentas (por cierto, internamente MFC llama a InternetSetFilePointer() ).

Por ejemplo, con la siguiente cabecera pedirías al servidor los cien 100 bytes que van de la posición 1000 a 1099:


/* Después de HttpOpenRequest */

HttpAddRequestHeaders(l_hRequest, "Range: bytes=1000-1099", -1L, HTTP_ADDREQ_FLAG_ADD_IF_NEW);

/* Antes de HttpSendRequest */


Puedes poner cosas tales como:
1000-1099
1000-
-1099

Si tienes problemas puedo postear algún código que tengo por ahí y una explicación más detallada.

Saludos.

fiero

 Hola Juan
Ya habia seguido paso a paso la función de las MFC y la llamada a InternetSetFilePointer  devuelve el valor correcto. Sin embargo la llamada a InternetReadFile posterior lee "internamente" todos los bytes hasta llegar a la posición requerida y a continuación te devuelve la lectura a partir del puntero. Pero claro, si hay que esperar a que lea, no ganamos nada.
Yo creo que puede ser un problema de cachés internos, que para guardarse el fichero en la caché hace toda la lectura, he intentado abrir la conexión (en CInternetSession) con INTERNET_FLAG_DONT_CACHE, pero tampoco.

Así que ahora lo estoy haciendo con sockets a ver que tal. Por cierto, eso de los "Rangos" ¿se utiliza tambien en la cadena enviada al servidor por el socket "GET rutaFichero"? o no tiene nada que ver.

Si no consigo hacer el Seek con los sockets pruevo con HttpAddRequestHeaders a ver...

un saludo

www.videopanoramas.com Videopanoramas 3D player

Juan Mellado

 
Citar
eso de los "Rangos" ¿se utiliza tambien en la cadena enviada al servidor por el socket "GET rutaFichero"? o no tiene nada que ver

Sí, se utiliza en el GET. Las "cabeceras" HTTP son como los "parámetros" del GET. Mírate por ejemplo esta página (la primera que he encontrado con google buscando "Range: bytes="):
http://www.vbip.com/winsock/winsock_http_08_01.asp

Citar
Si no consigo hacer el Seek con los sockets pruevo con HttpAddRequestHeaders a ver...
Si ya tenías hecho el código con MFC, lo único que tiene que hacer es meter la llamada a HttpAddRequestHeaders, y ya no se leerá todo el fichero sino inmediatamente el trozo que quieras, sin cachés ni historias.

Saludos

fiero

 Hola otra vez,

Estuve probando la función HttpAddRequestHeaders pero no conseguí que me funcionase con mi implementación MFC, así que decidí hacerlo con sockets.

Bueno, me he hecho esta clase CFicheroHttp, que funciona como la clase CFile, pero con ficheros en internet. Me gustaría que le echarais un vistazo, porque resulta que la he probado con dos servidores diferentes y me funciona con un IIS, pero con un servidor Linux me devuelve "404", o sea, que el fichero no existe, aunque la ruta está bien.

No tengo ni zorra de sockets, así que si veis algo que está mal , me lo decís. He usado sockets por defecto, bloqueantes, ya que abro los ficheros desde otro hilo, no desde el principal.

Modo de empleo:

CFicheroHttp fichHttp;
char buffer[256];

if(fichHttp.OpenURL("http://www.telefonica.net/img/ltel.gif"))
{
 fichHttp.Read(buffer,256);
 fichHttp.Close();
}


CFicheroHttp

un saludo
www.videopanoramas.com Videopanoramas 3D player

BeRSeRKeR

 Asegúrate de que la ruta original está toda en minúsculas, tal y como tú lo has puesto. A veces estas cosas dan problemas.

Saludos.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

fiero

 He retomado el tema y después de darle muchas vueltas encontré el "fallo" por casualidad. Resulta, que si se conecta con un servidor Apache, hay que añadir en la línea de la petición el nombre del servidor y el puerto, si no siempre devuelve "404". Algo así:

sprintf(buf,"GET %s HTTP/1.1\r\nHost: %s:80\r\nRange: bytes=%d-\r\n\r\n",fichero,servidor,nPuntero);

Bueno, todo resuelto, gracias por vuestra ayuda
www.videopanoramas.com Videopanoramas 3D player






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.