读书人

select函数有关问题?

发布时间: 2012-04-23 13:17:38 作者: rapoo

select函数问题?????
int select(int maxfdp,fd_set *readfds,fd_set *writefds,fd_set *errorfds,struct timeval *timeout);
select函数如何判断各个集合发生变化了?
我的疑问就是假设我在服务器端监听了一个端口,当端口被客户端连接的时候就可以接受数据了,
像下面代码是的,但是我不明白怎么才能监听写集合发生变化,也就是写集合变化是在什么时候发生的?要不大家写个例子。

C/C++ code
main(){int sock;FILE *fp;struct fd_set fds;struct timeval timeout={3,0}; //select等待3秒,3秒轮询,要非阻塞就置0char buffer[256]={0}; //256字节的接收缓冲区/* 假定已经建立UDP连接,具体过程不写,简单,当然TCP也同理,主机ip和port都已经给定,要写的文件已经打开        sock=socket(...);       bind(...);         fp=fopen(...); */while(1)  {     FD_ZERO(&fds); //每次循环都要清空集合,否则不能检测描述符变化     FD_SET(sock,&fds); //添加描述符     FD_SET(fp,&fds); //同上     maxfdp=sock>fp?sock+1:fp+1; //描述符最大值加1     switch(select(maxfdp,&fds,&fds,NULL,&timeout)) //select使用      {      case -1: exit(-1);break; //select错误,退出程序      case 0:break; //再次轮询      default:       if(FD_ISSET(sock,&fds)) //测试sock是否可读,即是否网络上有数据        {         recvfrom(sock,buffer,256,.....);//接受网络数据         if(FD_ISSET(fp,&fds)) //测试文件是否可写           fwrite(fp,buffer...);//写入文件         //buffer清空;        } // end if break;      } // end switch  } //end while} //end main


[解决办法]
看到maxfd没,每次select>0返回,for循环遍历0...maxfd, FD_ISSET判断每个fd是否在集合里,在就操作,不在就不操作。在集合里你还的看是在读集合,写集合,还是错集合里,你还得看看这个fd是监听套接字还是已连接套接字,没了。

读书人网 >C++

热点推荐