C客户端:recv未按预期运行

C客户端:recv未按预期运行,c,networking,client,recv,C,Networking,Client,Recv,此版本的mainloop函数正确,但一旦更改: char buff[最大体长*2] 到char*buff=malloc(最大体长*2) 第一个recv不再工作了,它使buff为null,不再等待来自服务器的第一条消息。然而,它不应该有任何更改,它不是最后的同一类型吗 intmainloop(intsockfd) { 字符buff[最大体长*2]; char*buff_brk; 整数单位; memset(&buff,0,sizeof(buff)); 对于(int命令有效=1;1;命令有效=0){

此版本的mainloop函数正确,但一旦更改:

char buff[最大体长*2]
char*buff=malloc(最大体长*2)
第一个recv不再工作了,它使buff为null,不再等待来自服务器的第一条消息。然而,它不应该有任何更改,它不是最后的同一类型吗

intmainloop(intsockfd)
{
字符buff[最大体长*2];
char*buff_brk;
整数单位;
memset(&buff,0,sizeof(buff));
对于(int命令有效=1;1;命令有效=0){
recv(sockfd,buff,sizeof(buff),0);
//act_命令(strdup(buff));
printf(“%s\n”,浅黄色);
memset(&buff,0,sizeof(buff));
numbytes=读取(0,buff,最大体长*2);
buff[numbytes-1]='\0';
发送(sockfd,buff,sizeof(buff),0);
memset(&buff,0,sizeof(buff));
}
返回0;
}

问题的罪魁祸首是,第一个(VLA)版本中的
sizeof(buff)
就是您所期望的。但在第二种情况下(malloc),它返回
char*
的大小。因此,4或8字节而不是
MAX\u BODY\u LENGTH*2

recv()
返回一个
int
int
不能为空。你的问题没有道理。如果将
buff
更改为指针,则
sizeof(buff)
将成为指针的大小,这可能会让您感到困惑?当可以在堆栈上使用数组时,为什么要使用
malloc()。但是,如果不将
recv()
的结果存储到一个变量中,然后(1)测试它的-1,(2)测试它的零,然后(3)在前两次测试失败时使用它作为接收的字节计数,就不可能编写正确的网络代码。不要这样写代码。我说的是缓冲区而不是返回,我的BAD缓冲区也不能为空。它是在堆栈上声明的局部变量,其值不可能为null。它可能看起来是空的,因为它只包含(或以)一个空字符:\n这不是一回事,与您最初的声明相去甚远。不,我按MAX_BODY_Length更改每个siezof(),但它不会更改行为。请同时更新代码段。另外,检查recv、read、send的返回值也会有所帮助。再加上第二种情况下对memset make pointer的调用。