Sockets y http

Estoy realizando un cliente http en c. Cuando lanzo ciertas peticiones (da igual que sean GET o POST), al recibir la respuesta utilizando la función recv en modo bloqueante, tras la última recepción de datos se me queda esperando durante dos minutos exactos, tras los cuales la función devuelve 0 bytes recibidos y quisiera saber qué me puede estar pasando o cómo podría solucionarlo.

1 Respuesta

Respuesta
1
Lo que te pasa es que al recibir el ultimo bloque de caracteres, esto es que si el servidor envía un total de 1300 bytes y tu ya has recibido los 1300 bytes, al realizar la recv() en modo bloqueante la función se bloquea por que no recibe nada más. En este punto te quedas dos minutos que es lo que tarda el servidor en cerrarte la conexión, momento en que recibes ese cierre a través de la recv con 0 bytes devueltos.
Si ves el manual, la recv puede devolver tres valores: recv()>0 que devuelve los caracteres leídos, recv()==0 que indica que se ha cerrado la conexión en el otro lado y recv()<0 que indica que hay un error.
Como por lo que veo, no sabes interpretar el numero de caracteres que tienes que leer, tu esperas hasta que el servidor te cierra la conexión, que es lo que te esta ocurriendo. En realidad deberías obtener el tamaño del total de bytes que vas a recibir, y leer hasta que esa cantidad te halla llegado, momento en el que debes de cerrar la conexión.
El numero de bytes que esperas viene en el propio bloque de datos de respuesta a la GET o POST, de manera que en un primer instante debes de leer caracteres hasta que recibas ese dato, y luego continuar leyendo solo hasta el numero de caracteres que ya sabes.
[email protected]
Gracias, me parece una buena solución aunque el servidor no siempre me facilita el tamaño de la respuesta. El problema era que en la petición http mandaba Connection: Keep-Alive en lugar de Connection: Close.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas