- 论坛徽章:
- 0
|
当使用二个rfd时,比较正常
FD_ZERO(&mrfd);
fd_set mrfd,rfd;
FD_SET(sock,&mrfd);
step.tv_sec = 1000;
step.tv_usec = 500;
maxp = sock;
while( 1 ){
memcpy(&rfd,&mrfd,sizeof(mrfd)); //每次将mrfd的值over rfd的值
ret = select(maxp+1 ,&rfd,NULL ,NULL,&step); //select使用rfd
if(ret < 0){
perror("SELECT:");
return -1;
}
if(ret == 0){
continue;
}
ready = ret;
for(i=3;i<=maxp && ready > 0;i++){
if(FD_ISSET(i,&rfd) == 0)
continue;
if(sock == i){
ready--;
do{
newsock = accept(sock,NULL,NULL);
if(newsock < 0){
if(errno != EWOULDBLOCK){
perror("ACCEPT:");
return -1;
}
continue;
}
else{
printf("accept new conn ... %d \n",newsock);
fcntl(newsock,F_SETFL,O_NONBLOCK);
FD_SET(newsock,&mrfd); //这里将fd加入到mrfd,而不是rfd
maxp = MAX(maxp,newsock);
continue;
}
}while(newsock != -1);
}
} |
代码改正后,select正常
17:23:56 select(4, [3], NULL, NULL, {1000, 500}) = 1 (in [3], left {995, 404000}) <4.595967>
17:24:00 accept(3, 0, NULL) = 4 <0.000007>
17:24:00 fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 1), ...}) = 0 <0.000003>
17:24:00 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2a95557000 <0.000004>
17:24:00 write(1, ""..., 23accept new conn ... 4
) = 23 <0.000005>
17:24:00 fcntl(4, F_SETFL, O_RDONLY|O_NONBLOCK) = 0 <0.000003>
17:24:00 accept(3, 0, NULL) = -1 EAGAIN (Resource temporarily unavailable) <0.000004>
17:24:00 select(5, [3 4], NULL, NULL, {995, 404000}) = 1 (in [3], left {992, 463000}) <2.940178>
17:24:03 accept(3, 0, NULL) = 5 <0.000007>
17:24:03 write(1, ""..., 23accept new conn ... 5
) = 23 <0.000004>
17:24:03 fcntl(5, F_SETFL, O_RDONLY|O_NONBLOCK) = 0 <0.000003>
17:24:03 accept(3, 0, NULL) = -1 EAGAIN (Resource temporarily unavailable) <0.000004>
17:24:03 select(6, [3 4 5], NULL, NULL, {992, 463000} <unfinished ...>
请教一下这是为什么呢?为什么只使用一个rfd会FD_SET错误呢 |
|