Ver Mensaje Individual
  #2 (permalink)  
Antiguo 25/01/2014, 04:11
vosk
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 12 años, 3 meses
Puntos: 83
Respuesta: Punteros y cadena.

No se si lo has solucionado, pero por ahi veo algo raro. Cuando trabajas con sockets no puedes esperar recibir BYTES_BUFFER_TRANFER, sino que le indicas al recv que dispones de BYTES_BUFFER_TRANFER bytes para guardar datos y que te copie lo que sea posible, con eso te retorna el nº de bytes copiados (en tu codigo brecv), y es ese valor el que tienes que usar para incrementar el contador de recibidos; por lo mismo tienes que truncar el buffer de datos recibidos al nº de bytes copiados si ese no se llena.

Otra cosa, en la parte de malloc y realloc; supongamos que BYTES_BUFFER_TRANFER es 256; inicias el proceso:

Código C:
Ver original
  1. //inicio
  2. allrecv = 0;
  3.  
  4. //primer ciclo
  5. si allrecv > 256 => realloc //no porque allrecv = 0
  6. sino => malloc // estamos en este caso
  7. recv //recibes 256
  8. allrecv += 256
  9.  
  10. //segundo ciclo, ahora allrecv = 256 ok?
  11. si allrecv > 256 => realloc //tampoco porque allrecv = 256
  12. sino => malloc // volvemos a estar en este caso ?!?!
  13. //fin de la partida

Supongo que ya ves por donde van los tiros.

Aun otra cosa: supongo que cuando descomentas la linea st->httpcontent = buffer entonces comentas la de free(buffer) :)

Lo que se hace en estos casos es implementar una funcion que bloquea memoria y a la vez concatena lo recibido; te copio una que precisamente hice el otro dia (forma parte de una libreria para un proyecto que tenemos entre manos con un colega):

Código C:
Ver original
  1. /**
  2.     buffer, buffer de trabajo
  3.     block, datos con los que vamos a ampliar el buffer
  4.     block_size, tamaño de block
  5.     buffer_size, tamaño de buffer antes de la ampliacion
  6.     zend, boleano para añadir un 0 al final, es un parche para trabajar con texto
  7. */
  8. int hsock_alloc_strcat(void **buffer, void *block, int block_size, int buffer_size, char zend) {
  9.     char *ptr;
  10.     char endz =(zend)?1:0;
  11.  
  12.     if(!(*buffer)) {
  13.         if(!(*buffer = malloc(block_size + endz))) {
  14.             return 0;
  15.         }
  16.         memset(*buffer, 0, block_size + endz);
  17.     } else {
  18.         if(!(ptr = realloc(*buffer, block_size + buffer_size + endz))) {
  19.             return 0;
  20.         }
  21.         *buffer = ptr;
  22.     }
  23.  
  24.     memcpy(*buffer + buffer_size, block, block_size);
  25.  
  26.     return block_size;
  27. }
  28.  
  29. //ejemplo
  30. char *mibuffer = 0;
  31. char tmp[512];
  32. int nbr, nbc, ttbuffer = 0;
  33.  
  34. //tal como recibo le digo que me amplie el buffer
  35. nbr = recv(socket, tmp, sizeof(tmp), 0);
  36. nbc = hsock_alloc_strcat(&mibuffer, tmp, nbr, ttbuffer, 0);
  37. ttbuffer += nbc;
  38.  
  39. //al finalizar
  40. free(mibuffer);

Espero que te sirva
Saludos
vosk