1. 场景描述
即A先连接,B后连接,只能先A后B依次输入数据,服务端依次读取数据
这是因为进行循环遍历lfd之后的描述符时,没有判断文件描述符i是否在newset集合中
//cfd发生变化
for(int i=lfd+1;i<=maxfd;i++){printf("i num = %d\t",i);//这里这里//如果没有进行FD_ISSET判断就会出现上述情况if(FD_ISSET(i,&newset)){char buf[1024]="";int ret=Read(i,buf,sizeof(buf));if(ret<0){perror("");close(i);FD_CLR(i,&oldset);}else if(ret==0){printf ("client close\n");close(i);FD_CLR(i,&oldset);}else{printf("write %s",buf);}}}
2. 为什么需要进行FD_ISSET判断呢?
以上述代码为例,当FD_ISSET返回值为1时,表明文件描述符i处于就绪状态,可以进行IO操作
我们修改这几行代码就可很清晰看出,每次都是顺序循环所有的文件描述符,如果没有FD_ISSET判断,系统就会等待该文件描述符响应,直到可以进行后续操作为止
for(int i=lfd+1;i<=maxfd;i++){printf("未判断:i num = %d\n",i);if(FD_ISSET(i,&newset)){printf("判断:i val =%d\n",i);...}
上述例子中源代码
https://gitee.com/baimuyz/gomoku-project/blob/master/NW/select_1.c