在socket通讯程序里,select 起到什么作用

来源:互联网 发布:unity3d接入ios内购 编辑:程序博客网 时间:2024/05/02 01:49

详细请看以下的程序段,   对其中的意思不是很了解,     有高手请帮解释一下,多谢!!  
   
          int         maxfd;  
          fd_set         mask,   rfds;  
          struct   timeval   timeout;  
   
          timeout.tv_sec     =   1; /*   阻塞1秒后超时返回   */    
          timeout.tv_usec   =   0;    
   
          memset(&mask,   0,   sizeof(fd_set));  
  memset(&rfds,   0,   sizeof(fd_set));  
  FD_ZERO(&mask);  
  FD_ZERO(&rfds);  
  FD_SET(s,   &mask);  
  maxfd   =   s;  
   
          while   (1)  
          {  
                  rfds   =   mask;  
                  if   (select(maxfd   +   1,   &rfds,   NULL,   NULL,   &timeout)   <=   0)  
  {                                                                                      
                  continue;  
  }  
   
                  if   (FD_ISSET(s,   &rfds))  
  {  
                          remoteAddrLen   =   sizeof(remote);  
                          client   =   accept(s,(struct   sockaddr   *)&remote,&remoteAddrLen);  
   
        ......  
  }  
   
        }

 

 

 

当SOCKET建立起来后,如果客户端有数据要发送,那服务端就会侦查到这一事件(当然还有其他事件)  
  这个select函数就是把你想侦查到的事件“收集”起来。没“收集”的,就不会侦查到,当然就不能对这些事件做出反应了  

 

 

select()的机制中提供一fd_set的数据结构,实际上是一long类型的数组,      
  每一个数组元素都能与一打开的文件句柄(不管是Socket句柄,还是其他      
  文件或命名管道或设备句柄)建立联系,建立联系的工作由程序员完成,      
  当调用select()时,由内核根据IO状态修改fd_set的内容,由此来通知执      
  行了select()的进程哪一Socket或文件可读,下面具体解释:      
       
  #include     <sys/types.h>      
  #include     <sys/times.h>      
  #include     <sys/select.h>      
       
  int   select(nfds,   readfds,   writefds,   exceptfds,   timeout)      
  int   nfds;      
  fd_set   *readfds,   *writefds,   *exceptfds;      
  struct   timeval   *timeout;      
       
  ndfs:select监视的文件句柄数,视进程中打开的文件数而定,一般设为呢要监视各文件      
              中的最大文件号加一。      
  readfds:select监视的可读文件句柄集合。      
  writefds:   select监视的可写文件句柄集合。      
  exceptfds:select监视的异常文件句柄集合。      
  timeout:本次select()的超时结束时间。(见/usr/sys/select.h,      
                  可精确至百万分之一秒!)      
       
  当readfds或writefds中映象的文件可读或可写或超时,本次select()      
  就结束返回。程序员利用一组系统提供的宏在select()结束时便可判      
  断哪一文件可读或可写。