在这段代码中,如何在partial recv()中处理free和realloc中的错误
为了在网络中处理部分recv(),我尝试通过逐个读取从客户端发送的数据并动态分配内存,然后打印消息来检查缓冲区,直到它接收到“\n”,但我遇到了类似realloc()的错误:无效指针中止() 我处理部分读取的代码:在这段代码中,如何在partial recv()中处理free和realloc中的错误,c,linux,unix,networking,network-programming,C,Linux,Unix,Networking,Network Programming,为了在网络中处理部分recv(),我尝试通过逐个读取从客户端发送的数据并动态分配内存,然后打印消息来检查缓冲区,直到它接收到“\n”,但我遇到了类似realloc()的错误:无效指针中止() 我处理部分读取的代码: char *recieve_msg(int sockfd) { char *newp; char *recv_buf; int recv_buf_size = 0; int ret_recv = 0; recv_buf = (char *)m
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;
}
编辑代码:
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;
}
这也产生了同样的问题。正如其他海报所指出的,您不应该
realloc()
修改指针tmp
被初始化为recv\U buf
。但是tmp
被修改为tmp=tmp+ret_recv
,您正试图realloc()
将tmp
修改为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] = '\0';
return msg_buf;
}
撇开这个问题不谈,我强烈谴责
realloc()
”为每个recv()
调用占用内存。你可以想出一些更好的办法。例如,在您的情况下,有一个全局缓冲区并在接收到\n
时对其进行操作。如果全局缓冲区即将填满,而您的消息仍未收到,则将缓冲区重新定位到更大的大小(可能多100字节左右)。您不能realloc
(甚至free
)已修改指针的缓冲区。(recv\u buf=recv\u buf+ret\u recv;
)。请注意,您的问题标题与您的实际问题无关。@Eugene Sh。谢谢您的建议,我已经用建议更新了代码,但这也会导致相同的输出。这也会产生相同的问题。-因为它有完全相同的问题。修改后,您将realloc
tmp
。与问题无关:您的代码还存在一些其他问题。出现错误或连接关闭时,会泄漏分配的内存。当出现错误或接收到零字节时,您也无法返回和接收到的数据,因此很可能会丢失读取的最后一块数据。