Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Socket bloqueado

Iniciado por tamat, 15 de Julio de 2007, 03:12:28 AM

« anterior - próximo »

tamat

Tengo un problema con mi codigo de red.

Tengo una clase que permite hacer peticiones HTTP, funciona bastante bien para cargar archivos de la red como imagenes. Ayer se me ocurrió intentar hacer un programa que cargue imagenes de flickr, pero resulta que por alguna extraña razon el socket se me queda bloqueado cuando trato de cargar imagenes de flickr, y nunca llega a recibir mensajes, no es cuestion del tamaño porque uso urls de fotos pequeñas y ademas he probado de cargar otras fotos más grandes de otras urls y ningun problema.

Pero si es flickr se me bloquea en el:
bytesRead = recv(Socket, Rover, mDataBufferSize - mDataSize, 0);

No es problema de threads por si alguien pregunta.

He pensado que tal vez uso un GET erroneo, os lo pasteo aquí, pero ya os digo que puedo pillar de cualquier url menos de flickr:

GET /1310/705270960_e57e2ced39_o.jpg HTTP/1.1
Host: farm2.static.flickr.com
Connection: close

User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.2; es-ES; rv:1.8.1.4) Gecko/20070515 Firefox/2.0.0.4


Flickr deja pedir imagenes sin referer así que no creo que necesite poner ninguno, pero aun así, si flickr no quiere enviarme respuesta entonces no debería quedarse colgado en esa funcion.

Cualquier sugerencia será bienvenida.
Por un stratos menos tenso

Warchief

Has creado el socket con O_NONBLOCK ? En ese caso debería darte un error EWOULDBLOCK, que podrías tratar y continuar con la siguiente foto. Si no has puesto O_NONBLOCK, se bloquea hasta recibir algo.

Usa fcntl para ello.

// fd es el descriptor del socket
 if ( fcntl(fd, F_SETFL, O_NONBLOCK) < 0 )
   perror("fcntl: no se puede fijar operaciones no bloqueantes");

gdl

Quizás el servidor de flickr requiera algunas cosas más en la cabecera http. Lo único que se me ocurre es el referrer, pero seguro que hay más cosas en la cabecera.

Otra opción que puede ser interesante es que te descargues el Packetizer (que monitoriza los paquetes que se envían o reciben por la red) y veas qué es lo que hacen los navegadores de red. Qué mandan en las cabeceras y qué flujo de paquetes. Eso te puede orientar mucho para mimetizar el comportamiento de un navegador.

tamat

Respondiendo a Warchief:

Es que tal y como lo tengo programado yo uso sockets bloqueantes, ya que los ejecuto en un thread y me va mejor así, me resulta más cómodo, además no acabo de entender qué pasa, quiero decir, si flickr no contesta el socket debería morirse, o si a flickr no le mola pues que lo cierre directamente.

De todas maneras si no encuentro solución pues acabaré haciendo lo que dices, pero me quedaría con las ganas de saber por qué.

Respondiendo a gdl:

Pensé lo mismo sobre la cabecerá, pero probé usando esta aplicacion web que permite ver el request y el response y mi request es más o menos igual. Además que me consta que a Flickr le mola que usen sus fotos para aplicaciones.

Probaré de instalar el sniffer que me comentas.

Gracias a los dos, cualquiera informacion que me podais dar me vendría genial.
Por un stratos menos tenso

Warchief

Cita de: "tamat"Respondiendo a Warchief:

Es que tal y como lo tengo programado yo uso sockets bloqueantes, ya que los ejecuto en un thread y me va mejor así, me resulta más cómodo, además no acabo de entender qué pasa, quiero decir, si flickr no contesta el socket debería morirse, o si a flickr no le mola pues que lo cierre directamente.

De todas maneras si no encuentro solución pues acabaré haciendo lo que dices, pero me quedaría con las ganas de saber por qué.

No hay problema en que sea 1 hilo. Yo diría que mejor no bloqueante si es sólo 1 hilo, porque puedes hacer más cosas mientras responde.

Has probado distintas urls de flickr o siempre la misma?

tamat

Con un thread me refería a un thread aparte de la ejecución principal, y sip, probé varias urls de flickr, las que retorna el RSS de diferentes personas.
Por un stratos menos tenso






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.