elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Problema extraño al recibir string por socket TCP (ANSI-C + Berkeley sockets)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Problema extraño al recibir string por socket TCP (ANSI-C + Berkeley sockets)  (Leído 2,583 veces)
Scott Code

Desconectado Desconectado

Mensajes: 2


Ver Perfil
Problema extraño al recibir string por socket TCP (ANSI-C + Berkeley sockets)
« en: 6 Noviembre 2011, 19:31 pm »

Para recibir una página web uso este código:

Código
  1. void http_request(char *preply, char *ph, char *pdata, int metodo)
  2. {
  3.        int tamreq = 0;
  4. int leidos = -1;
  5. char temp[4096] = {0};
  6. int bloque = 4096;
  7.  
  8. char tam_peticion[10] = {0};
  9. char req[4096];
  10.  
  11. if (metodo == 1) // POST
  12. {
  13. sprintf(tam_peticion, "%d", (int)strlen(pdata));
  14. strcpy(req, ph);
  15. strcat(req, "Content-Length: "); strcat(req, tam_peticion);
  16. strcat(req, "\r\n\r\n");
  17. strcat(req, pdata);
  18. }
  19. else // GET
  20. {
  21. strcpy(req, ph);
  22. strcat(req, "\r\n");
  23. }
  24.  
  25. tamreq = strlen(req);
  26.  
  27. if ( (send(dsock, req, tamreq, 0)) == -1)
  28. {
  29. printf("error en el send\n");
  30. exit(1);
  31. }
  32.  
  33. memset (preply, 0, TAM_REPLY);
  34.  
  35. while ( (leidos = recv(dsock, temp, bloque, 0)) != 0 )
  36. {
  37. if (leidos == -1)
  38. {
  39. printf("error en recv\n");
  40. exit (1);
  41. }
  42. strcat(preply, temp);
  43. preply += leidos;
  44. }
  45.  

El analizador de protocolos (Wireshark) muestra como mi tarjeta de red recibe toda la web:
Código:
Content-encoded entity body (gzip): 10948 bytes -> 54872 bytes

Sin embargo, en preply (es dónde se almacena el código de la página web) tiene el tamaño de 383 (valor dado por la función strlen). Es de 383 para cualquier petición que haga (lógicamente si el tamaño de la página web  sobrepasa esa cantidad).

De alguna manera preply está limitado a 383 bytes por algún error al usar las funciones de sockets, o eso llego a entender.

preply apunta a un array reply de 200.000 elementos de tipo char. Osea, que TAM_REPLY está definido así:
Código
  1. #define TAM_REPLY 200000

¿A alguien se le ocurre porque no puedo recibir todo el código de la web?

Gracias de antemano


En línea

Scott Code

Desconectado Desconectado

Mensajes: 2


Ver Perfil
Re: Problema extraño al recibir string por socket TCP (ANSI-C + Berkeley sockets)
« Respuesta #1 en: 6 Noviembre 2011, 20:44 pm »

Añadiendo este printf para ver cuantos bytes recibe

Código
  1. printf("leidos %d %d\n", leidos, strlen(temp));
  2.  

Imprime:
leidos 1412 383
leidos 1412 12
leidos 1412 279
leidos 1412 80
leidos 1412 122
leidos 1412 231
leidos 1412 116
leidos 1442 375

Cómo es posible que recv lea 1412 bytes y que almacene menos en temp? Me estoy volviendo loco con esto :-(


En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines