Windows 网络编程(8).2

4.1 select 模型
       a>利于select函数,判断套接字上是否可以读取或写入数据,
          int select ( int nfds,               //忽略
                       fd_set  FAR* readfds,   //检察可读性
                       fd_set  FAR* writefds,  //检察可写性
                       fd_set  FAR* exceptfds, //异常数据
                       const struct timeval FAR*  timeout
                     );
          说明:fd_set类型,代表着特定套接字的集合,
               readfds包括任何一个下述的套接字:
                 i>有数据可以读入
                 ii>连接己经关闭,重设或中止
                 iii>假如己经调用了listen,而且一个连接正在建立,那么accept函数调用会成功
               writefds包括任何一个下述的套接字
                 i>有数据可以发出
                 ii>如果己完成了对一个非锁定连接调用的处理,连接就会成功
               exceptfds包括任何一个下述的套接字
                 i>假如己完成了对一个非锁定连接调用的处理,连接尝试就会失败
                 ii>有带外(out-of-band,OOB)数据可供读取
               select 函数完成后,可读取或可写入数据的套接字,保留在fds_set集合中,否则会被
               删除掉,
               三个fds_set集合参数,至少有一个不能为空值,
               将一个套接字分配给任何一个集合后,再调用select,便可知一个套接字是否发生I/O活动
         b>FD_CLR(s,*set):从set中删除套接字
         c>FD_ISSET(s,*set):检查s是否set集合的一名成员
         d>FD_SET(s,*set):将套接字s加入集合set
         e>FD_ZERO(*set):将set初始化成空集合
         f>下述步骤可以完成select操作一个或多个套接字句柄的全过程:
            1)使用FD_ZERO宏,初始化自己感兴趣的每一个fd_set
            2)使用F_SET宏,将套接字句柄分配给自己感兴趣的每个fd_set
            3)调用select函数,然后等待在指定的fd_set集合中,I/O活动设置好一个或多个套接字句柄.
              select完成后,会返回在所有fd_set集合中设置的套接字句柄总数,并对每个集合进行相
              应的更新
            4)根据select的返回值,应用程序便可判断出哪些套接字可以读取或写入(使用FD_ISSET),
              对每个fd_set集合进行检查
            5)知道了每个集合中"待决"的I/O操作后,对I/O进行处理,然后返回步骤1),继续进行select
              处理.
            select返回后,会修改每个fd_set结构,删除不存在待决I/O操作的套接字句柄
    g>例子为一个(只有一个)套接字设置select模型所需的一系列基本步骤.
      (若想在这个应用程序中添加更多的套接字,只需为额外的套接字维护它们的一个列表或数组)
      SOCKET     s;
      fd_set     fdread;
      int        ret;

      //Creat a socket and accept a connection
      while(True)
      {
          // Always clear the read set before calling select()
          FD_ZERO(&fdread);

          //Add socket s to the read set
          FD_SET(s,&fdread);

          if (ret=select(0,&fdread,NULL,NULL,NULL)==SOCKET_ERROR)
          {
              //Error
          }
          if (ret>0)
          {
              //For this simple case,select() should return the value 1,
              //An application dealing with more than one socket could get a value
              //greater than 1,At this point,your application should check to see whether
              //the socket is part of a set
              if (FI_ISSET(s,&fdread))
              {  //A read event has occurred on socket s}
          }
      }
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值