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//inicio
allrecv = 0;
//primer ciclo
si allrecv
> 256 => realloc //no porque allrecv = 0sino
=> malloc // estamos en este casorecv //recibes 256
allrecv += 256
//segundo ciclo, ahora allrecv = 256 ok?
si allrecv
> 256 => realloc //tampoco porque allrecv = 256sino
=> malloc // volvemos a estar en este caso ?!?!//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/**
buffer, buffer de trabajo
block, datos con los que vamos a ampliar el buffer
block_size, tamaño de block
buffer_size, tamaño de buffer antes de la ampliacion
zend, boleano para añadir un 0 al final, es un parche para trabajar con texto
*/
int hsock_alloc_strcat(void **buffer, void *block, int block_size, int buffer_size, char zend) {
char *ptr;
char endz =(zend)?1:0;
if(!(*buffer)) {
if(!(*buffer
= malloc(block_size
+ endz
))) { return 0;
}
memset(*buffer
, 0, block_size
+ endz
); } else {
if(!(ptr
= realloc(*buffer
, block_size
+ buffer_size
+ endz
))) { return 0;
}
*buffer = ptr;
}
memcpy(*buffer
+ buffer_size
, block
, block_size
);
return block_size;
}
//ejemplo
char *mibuffer = 0;
char tmp[512];
int nbr, nbc, ttbuffer = 0;
//tal como recibo le digo que me amplie el buffer
nbr = recv(socket, tmp, sizeof(tmp), 0);
nbc = hsock_alloc_strcat(&mibuffer, tmp, nbr, ttbuffer, 0);
ttbuffer += nbc;
//al finalizar
Espero que te sirva
Saludos
vosk