项目场景:
在做本地套接字连接的时候,客户端发送给服务端若干字符,但服务端显示读到的却一直是1个。查了半天,原来是括号的误用。
问题描述
服务端打印read返回值,不换行,还一直是1。
看看代码,能看出问题吗?逻辑很清晰,就是能从客户端读到东西就一直读,然后返回处理后的数据。
while((ret=read(cfd,buf,sizeof(buf))>0)){ //就是这里的问题
printf("返回的大小为%d\n",ret);
for(i=0;i<ret;i++){
buf[i]= toupper(buf[i]);
}
write(STDOUT_FILENO,buf,ret);
write(cfd,buf,ret);
}
这是客户端的显示情况,
这是客户端的代码,
while(fgets(buf, sizeof(buf),stdin)!=NULL){
write(cfd,buf, strlen(buf));
printf("%lu\n",strlen(buf));
ret=read(cfd,buf,sizeof(buf));
printf("%d\n",ret);
write(STDOUT_FILENO,buf,ret);
}
原因分析:
while((ret=read(cfd,buf,sizeof(buf))>0))
先运算read(cfd,buf,sizeof(buf)),假如返回3,并没有及时赋值给ret,而是先与0进行比较,3>0为真,得到1,赋值给ret。
解决方案:
总的来说,就是括号套错了,改成下边这样。
while((ret=read(cfd,buf,sizeof(buf)))>0){
printf("返回的大小为%d\n",ret);
for(i=0;i<ret;i++){
buf[i]= toupper(buf[i]);
}
write(STDOUT_FILENO,buf,ret);
write(cfd,buf,ret);
}
先计算(ret=read(cfd,buf,sizeof(buf)),得到ret=3,再比较ret>0,得到真,进入while,此时ret值还是3,没有变化。
改正后服务端显示
改正后客户端显示