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