Ver Mensaje Individual
  #1 (permalink)  
Antiguo 20/01/2014, 23:18
Avatar de guzzano
guzzano
 
Fecha de Ingreso: julio-2010
Ubicación: Isla de Margarita
Mensajes: 162
Antigüedad: 13 años, 9 meses
Puntos: 13
Punteros y cadena.

Buenos días. Tengo un problema con unos datos que quiero guardar en una cadena.

Tengo la siguiente función, que cargará los datos a una memoria dinámica que reciba desde un socket.

Código C:
Ver original
  1. int recv_text (int s_socket, int hlength,
  2.   const char * header, httpstruct * st)
  3. {
  4.   char *buffer = NULL;
  5.   char *bfflen;
  6.  
  7.   unsigned long long allrecv = 0;
  8.   int brecv = 0;
  9.   int bsend = 0;
  10.  
  11.   int r_timeout;
  12.   int s_timeout;
  13.  
  14.   timeout t_out;
  15.  
  16.   t_out.tv_sec = RESOLVED_TIMEOUT;
  17.   t_out.tv_usec = 0;
  18.  
  19.   /* recv timeout */
  20.   r_timeout = setsockopt (s_socket,  
  21.     SOL_SOCKET, SO_RCVTIMEO, &t_out,
  22.     sizeof (timeout));
  23.  
  24.   /* send timeout */
  25.   s_timeout = setsockopt (s_socket,  
  26.     SOL_SOCKET, SO_SNDTIMEO, &t_out,
  27.     sizeof (timeout));
  28.  
  29.   if (r_timeout < 0 || s_timeout < 0)
  30.     return NOT_SETOPT;
  31.  
  32.   bsend = send(s_socket, header,
  33.     hlength, 0);
  34.  
  35.   if (t_out.tv_sec == 0)
  36.     return TIMEOUT;
  37.   else if (bsend != hlength)
  38.     return HEADER_IS_SHORT;
  39.  
  40.   do
  41.   {
  42.     if (allrecv > BYTES_BUFFER_TRANFER)
  43.     {
  44.       buffer = realloc(buffer, allrecv);
  45.      
  46.       if (!buffer)
  47.       {
  48.         close(s_socket);
  49.         return NOT_MEMORY;
  50.       }
  51.      
  52.       bfflen = buffer + BYTES_BUFFER_TRANFER;
  53.     }
  54.     else
  55.     {
  56.       buffer = malloc(BYTES_BUFFER_TRANFER);
  57.  
  58.       if (!buffer)
  59.         return NOT_MEMORY;
  60.      
  61.       bfflen = buffer;
  62.     }
  63.  
  64.     brecv = recv(s_socket, bfflen,
  65.       BYTES_BUFFER_TRANFER, PROTOCOL_ZERO);
  66.    
  67.     allrecv += BYTES_BUFFER_TRANFER;
  68.   } while (brecv > 0);
  69.  
  70.   /* debug without null byte; *(buffer+allrecv) = '\0'; */
  71.   puts(buffer);
  72.   free(buffer); /* for valgrind debug */
  73.   /* */
  74.  
  75.   /* st->httpcontent = buffer */
  76.   st->size_httpcontent = allrecv;
  77.  
  78.   close (s_socket);
  79.   return SUCCESS;
  80. }

El problema sucede que no guarda los datos. Creo la memoria dinámica, la lleno de datos, y cuando vuelva otra vez el bucle, reasignará un espacio a buffer y con bfflen le digo que tiene que empezar a llenar luego de x espacios (BYTES_BUFFER_TRANFER), pero no funciona. Siempre me muestra la cadena mal formada. Disculpen si no me supe explicar.

Saludos.