Tengo la siguiente función, que cargará los datos a una memoria dinámica que reciba desde un socket.
Código C:
Ver original
int 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 { 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'; */ /* */ /* 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.