一个括号引发的bug——服务端只显示read1个

项目场景:

在做本地套接字连接的时候,客户端发送给服务端若干字符,但服务端显示读到的却一直是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,没有变化。

改正后服务端显示

在这里插入图片描述
改正后客户端显示
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值