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