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 originalint recv_text (int s_socket, int hlength,
const char * header, httpstruct * st)
{
char *buffer = NULL;
char *bfflen;
unsigned long long allrecv = 0;
int brecv = 0;
int bsend = 0;
int r_timeout;
int s_timeout;
timeout t_out;
t_out.tv_sec = RESOLVED_TIMEOUT;
t_out.tv_usec = 0;
/* recv timeout */
r_timeout = setsockopt (s_socket,
SOL_SOCKET, SO_RCVTIMEO, &t_out,
sizeof (timeout));
/* send timeout */
s_timeout = setsockopt (s_socket,
SOL_SOCKET, SO_SNDTIMEO, &t_out,
sizeof (timeout));
if (r_timeout < 0 || s_timeout < 0)
return NOT_SETOPT;
bsend = send(s_socket, header,
hlength, 0);
if (t_out.tv_sec == 0)
return TIMEOUT;
else if (bsend != hlength)
return HEADER_IS_SHORT;
do
{
if (allrecv > BYTES_BUFFER_TRANFER)
{
if (!buffer)
{
close(s_socket);
return NOT_MEMORY;
}
bfflen = buffer + BYTES_BUFFER_TRANFER;
}
else
{
buffer
= malloc(BYTES_BUFFER_TRANFER
);
if (!buffer)
return NOT_MEMORY;
bfflen = buffer;
}
brecv = recv(s_socket, bfflen,
BYTES_BUFFER_TRANFER, PROTOCOL_ZERO);
allrecv += BYTES_BUFFER_TRANFER;
} while (brecv > 0);
/* debug without null byte; *(buffer+allrecv) = '\0'; */
free(buffer
); /* for valgrind debug */ /* */
/* st->httpcontent = buffer */
st->size_httpcontent = allrecv;
close (s_socket);
return SUCCESS;
}
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.