C语言 如何处理此代码中部分 recv() 中的 free 和 realloc 中的错误



为了处理网络中的部分recv((,我试图通过逐个读取从客户端发送的数据并动态分配内存然后打印消息来检查缓冲区,直到它收到"",但是我遇到了类似realloc((的错误:无效的指针中止((。

我处理部分读取的代码:

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] = '';
return recv_buf;
}

编辑的代码:

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] = '';
return recv_buf;
}

这也产生了同样的问题。

正如其他海报指出的那样,您不应该realloc()修改后的指针。tmp初始化为recv_buf。但是tmp被修改为tmp = tmp + ret_recv,并且您试图将修改后的tmprealloc()newp = realloc(tmp, (recv_buf_size + 1) * sizeof(char)),因此错误。您可以按如下方式使用代码:

char *recieve_msg(int sockfd)
{
char recv_buf[1], *msg_buf = NULL;
int recv_ret = 0, msg_len = 0;
while (1) {
recv_ret  = recv(sockfd, recv_buf, sizeof(recv_buf), 0);
if (recv_ret == -1)
return NULL;
else if (recv_ret == 0)
return  NULL;
else if (recv_buf[0] == 'n')
break;
msg_len++;
msg_buf = realloc(msg_buf, (msg_len + 1) * sizeof(char));
if (msg_buf == NULL) {
return NULL;
}
msg_buf[msg_len - 1] = recv_buf[0];
}
if (msg_buf == NULL)
return NULL;
msg_buf[msg_len] = '';
return msg_buf;
}

撇开这个问题不谈,我强烈谴责realloc()每次recv()通话的记忆。你可以想出一些更好的方法。例如,在您的情况下,拥有一个全局缓冲区并在收到n时对其进行操作。如果全局缓冲区即将填满并且仍然没有收到您的消息,则将缓冲区重新分配为更大的大小(可能多 100 字节左右(。

最新更新