Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Sockets y debugger

Estas en el tema de Sockets y debugger en el foro de C/C++ en Foros del Web. Buenos días, tengo un problemas con una función, todo funciona perfecto, pero cuando lo paso por valgrind me da un error con la función 'send' ...
  #1 (permalink)  
Antiguo 01/05/2013, 15:11
Avatar de guzzano  
Fecha de Ingreso: julio-2010
Ubicación: Isla de Margarita
Mensajes: 162
Antigüedad: 13 años, 9 meses
Puntos: 13
Sockets y debugger

Buenos días, tengo un problemas con una función, todo funciona perfecto, pero cuando lo paso por valgrind me da un error con la función 'send' supuestamente. Así que no sé realmente, ya me cansé de verificar y por eso pido su ayuda.

Función:
Código C:
Ver original
  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <string.h>
  4.  
  5. #include <sys/socket.h>
  6. #include <sys/types.h>
  7. #include <netdb.h>
  8.  
  9. extern struct {
  10.   int res_http;
  11.   int long size_f;
  12. } http_header;
  13.  
  14. int download_package (const char * name_package, const char * dir_package, const char * server_mirror, const char * protocol)
  15. {
  16.   int long total_size_bytes = 0;
  17.   int size_bytes;
  18.   int sockfd;
  19.  
  20.   char header[strlen(name_package)+strlen(server_mirror)+68];
  21.   char buffer[1024];
  22.  
  23.   struct addrinfo *recv_s;
  24.   struct addrinfo *result;
  25.   struct addrinfo hints;
  26.  
  27.   bzero(&(hints), 8);
  28.  
  29.   hints.ai_family = AF_UNSPEC;
  30.   hints.ai_socktype = SOCK_STREAM;
  31.   hints.ai_protocol = IPPROTO_TCP;
  32.  
  33.   if (getaddrinfo(server_mirror, protocol, &hints, &recv_s) < 0) {
  34.     printf("%c[%d;%dm[Error]%c[%dm Error al resolver el DNS de %s\n", 27, 1, 31, 27, 0, server_mirror);
  35.     return -1;
  36.   }
  37.  
  38.   for (result = recv_s ; result != NULL ; result = result->ai_next) {
  39.     if ((sockfd = socket(result->ai_family, result->ai_socktype, result->ai_protocol)) < 0)
  40.       continue;
  41.    
  42.     if (connect(sockfd, result->ai_addr, result->ai_addrlen) < 0) {
  43.       close(sockfd);
  44.       continue;
  45.     }
  46.    
  47.     break;
  48.     freeaddrinfo(recv_s);
  49.   }
  50.  
  51.   if (result == NULL) {
  52.     printf("%c[%d;%dm[Error]%c[%dm No se pudo conectar al servidor. \n", 27, 1, 31, 27, 0);
  53.     return -1;
  54.   }
  55.  
  56.   snprintf(header, sizeof(header), "GET /package/%c/%s.tar HTTP/1.1\r\nHost: %s\r\nConnection: close\r\n\r\n", name_package[0], name_package, server_mirror);
  57.  
  58.   if (send(sockfd, header, sizeof(header), result->ai_flags) < 0) {
  59.     printf("%c[%d;%dm[Error]%c[%dm No se pudo enviar la petición al servidor.\n", 27, 1, 31, 27, 0);
  60.    
  61.     freeaddrinfo(result);
  62.     close(sockfd);
  63.    
  64.     return -1;
  65.   }
  66.  
  67.   bzero(&buffer, sizeof(buffer));
  68.  
  69.     /* Esto envia la primera petición, no sé
  70.      * si funcionará así. Ya veremos... */
  71.  
  72.   if ((size_bytes = recv(sockfd, buffer, sizeof(buffer)-1, 0)) > 0) {
  73.     if (!strstr(buffer, "HTTP/1.1 200 OK")) {
  74.      
  75.       close(sockfd);
  76.       freeaddrinfo(result);
  77.      
  78.       return -1;
  79.     }
  80.   }
  81.  
  82.   do {
  83.     total_size_bytes += size_bytes;
  84.    
  85.   } while ((size_bytes = recv(sockfd, buffer, sizeof(buffer)-1, 0)) > 0);
  86.  
  87.   /* Aquí toda falta, guardar los datos
  88.    * y hacer la verificación de tamaño
  89.    * según HTTP y SHA256
  90.    */
  91.  
  92.   freeaddrinfo(result);
  93.  
  94.   return -2;
  95. }

Lo que me envía valgrind es

Código C:
Ver original
  1. [guzzano@localhost src]$ valgrind -v --track-origins=yes ./w0rm
  2. [...]
  3.  
  4. --25703-- Discarding syms at 0x442ea40-0x4435e9c in /usr/lib/libnss_files-2.16.so due to munmap()
  5. --25703-- Discarding syms at 0x443a8a0-0x443b674 in /usr/lib/libnss_mdns4_minimal.so.2 due to munmap()
  6. --25703-- Discarding syms at 0x443ec40-0x4442318 in /usr/lib/libnss_dns-2.16.so due to munmap()
  7. --25703-- Discarding syms at 0x4777f700-0x4778e0c4 in /usr/lib/libresolv-2.16.so due to munmap()
  8. ==25703==
  9. ==25703== HEAP SUMMARY:
  10. ==25703==     in use at exit: 0 bytes in 0 blocks
  11. ==25703==   total heap usage: 78 allocs, 78 frees, 6,722 bytes allocated
  12. ==25703==
  13. ==25703== All heap blocks were freed -- no leaks are possible
  14. ==25703==
  15. ==25703== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
  16. ==25703==
  17. ==25703== 1 errors in context 1 of 1:
  18. ==25703== Syscall param socketcall.send(msg) points to uninitialised byte(s)
  19. ==25703==    at 0x47587821: send (in /usr/lib/libc-2.16.so)
  20. ==25703==    by 0x804886B: download_package (in /home/guzzano/Escritorio/w0rm/src/w0rm)
  21. ==25703==    by 0x8048980: main (in /home/guzzano/Escritorio/w0rm/src/w0rm)
  22. ==25703==  Address 0xbecdda5e is on thread 1s stack
  23. ==25703==  Uninitialised value was created by a stack allocation
  24. ==25703==    at 0x8048655: download_package (in /home/guzzano/Escritorio/w0rm/src/w0rm)
  25. ==25703==
  26. ==25703== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)

Muchas gracias.
  #2 (permalink)  
Antiguo 01/05/2013, 15:31
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: Sockets y debugger

No se si habias encontrado esto antes, tal vez te ayude

http://www.inet.no/blog/post_valgrin...debugging.html

Saludos
vosk
  #3 (permalink)  
Antiguo 01/05/2013, 16:22
Avatar de guzzano  
Fecha de Ingreso: julio-2010
Ubicación: Isla de Margarita
Mensajes: 162
Antigüedad: 13 años, 9 meses
Puntos: 13
Respuesta: Sockets y debugger

Muchas gracias por tu respuesta vosk, sí, lo he leído con anterioridad, y lo he verificado más, aún así, inicié todas mis estructuras con bzero para salir de las dudas, y aún nada.

Es común el error según google, está en varios bug report, pero sin solución a la vista. Seguiré buscando.

Muchas gracias.

Etiquetas: funcion, int, sockets, string, struct
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:14.