For handling partial recv() in networks, I tried to check the buffer until it receives '\n' by reading the data sent from the client one by one and dynamically allocating the memory and then to print the message, but I encounter an error like realloc(): invalid pointer aborted().
My code for handling partial reads:
char *recieve_msg(int sockfd)
{
char *newp;
char *recv_buf;
int recv_buf_size = 0;
int ret_recv = 0;
recv_buf = (char *)malloc(sizeof(char));
while (1) {
ret_recv = recv(sockfd, recv_buf, sizeof(char), 0);
if (ret_recv == -1)
return NULL;
else if (ret_recv == 0)
return NULL;
else if (recv_buf[recv_buf_size] == '\n')
break;
recv_buf_size++;
newp = realloc(recv_buf, (recv_buf_size + 1) * sizeof(char));
if (newp == NULL) {
free(recv_buf);
return NULL;
}
recv_buf = newp;
recv_buf = recv_buf + ret_recv;
}
recv_buf[recv_buf_size] = '\0';
return recv_buf;
}
Edited Code:
char *recieve_msg(int sockfd)
{
char *newp;
char *tmp;
char *recv_buf;
int recv_buf_size = 0;
int ret_recv = 0;
recv_buf = (char *)malloc(sizeof(char));
if (recv_buf == NULL)
return NULL;
tmp = recv_buf;
while (1) {
ret_recv = recv(sockfd, tmp, sizeof(char), 0);
if (ret_recv == -1)
return NULL;
else if (ret_recv == 0)
return NULL;
else if (tmp[recv_buf_size] == '\n')
break;
recv_buf_size++;
newp = realloc(tmp, (recv_buf_size + 1) * sizeof(char));
if (newp == NULL) {
free(tmp);
return NULL;
}
tmp = newp;
tmp = tmp + ret_recv;
}
tmp[recv_buf_size] = '\0';
return recv_buf;
}
This too arises the same problem.