select模型

s e l e c t(选择)模型是Wi n s o c k中最常见的I / O模型。之所以称其为“ s e l e c t模型”,是由于它的“中心思想”便是利用s e l e c t函数,实现对I / O的管理!最初设计该模型时,主要面向的是某些使用U n i x操作系统的计算机,它们采用的是B e r k e l e y套接字方案。s e l e c t模型已集成到Winsock 1.1中,它使那些想避免在套接字调用过程中被无辜“锁定”的应用程序,采取一种有序的方式,同时进行对多个套接字的管理。

利用s e l e c t函数,我们判断套接字上是否存在数据,或者能否向一个套接字写入数据。之所以要设计这个函数,唯一的目的便是防止应用程序在套接字处于锁定模式中时,在一次I / O绑定调用(如s e n d或r e c v)过程中,被迫进入“锁定”状态;同时防止在套接字处于非锁定模式中时,产生W S A E W O U L D B L O C K错误。除非满足事先用参数规定的条件,否则s e l e c t函数会在进行I / O操作时锁定。

s e l e c t的函数(略)

从根本上说,f d _ s e t数据类型代表着一系列特定套接字的集合。其中, r e a d f d s集合包括符合下述任何一个条件的套接字:
■ 有数据可以读入。
■ 连接已经关闭、重设或中止。
■ 假如已调用了l i s t e n,而且一个连接正在建立,那么a c c e p t函数调用会成功。
w r i t e f d s集合包括符合下述任何一个条件的套接字:
■ 有数据可以发出。
■ 如果已完成了对一个非锁定连接调用的处理,连接就会成功。
最后,e x c e p t f d s集合包括符合下述任何一个条件的套接字:
■ 假如已完成了对一个非锁定连接调用的处理,连接尝试就会失败。
■ 有带外(O u t - o f - b a n d,O O B)数据可供读取。

在三个参数中(r e a d f d s、w r i t e f d s和e x c e p t f d s),任何两个都可以是空值( N U L L);但是,至少有一个不能为空值!在任何不为空的集合中,必须包含至少一个套接字句柄;否则, s e l e c t函数便没有任何东西可以等待。最后一个参数t i m e o u t对应的是一个指针,它指向一个t i m e v a l结构,用于决定s e l e c t最多等待I / O操作完成多久的时间。如t i m e o u t是一个空指针,那么s e l e c t调用会无限期地“锁定”或停顿下去,直到至少有一个描述符符合指定的条件后结束。

s e l e c t成功完成后,会在f d _ s e t结构中,返回刚好有未完成的I / O操作的所有套接字句柄的总量。若超过t i m e v a l设定的时间,便会返回0。不管由于什么原因,假如s e l e c t调用失败,都会返回S O C K E T _ E R R O R。

Wi n s o c k提供了下列宏操作,可用来针对I / O活动,对f d _ s e t进行处理与检查:
■ FD_CLR(s, *set):从s e t中删除套接字s。
■ FD_ISSET(s, *set):检查s是否s e t集合的一名成员;如答案是肯定的是,则返回T R U E。
■ FD_SET(s, *set):将套接字s加入集合s e t。
■ F D _ Z E R O ( * s e t ):将s e t初始化成空集合。

例如,假定我们想知道是否可从一个套接字中安全地读取数据,同时不会陷于无休止的“锁定”状态,便可使用F D _ S E T宏,将自己的套接字分配给f d _ r e a d集合,再来调用s e l e c t。要想检测自己的套接字是否仍属f d _ r e a d集合的一部分,可使用F D _ I S S E T宏。采用下述步骤,便可完成用s e l e c t操作一个或多个套接字句柄的全过程:
1) 使用F D _ Z E R O宏,初始化自己感兴趣的每一个f d _ s e t。
2) 使用F D _ S E T宏,将套接字句柄分配给自己感兴趣的每个f d _ s e t。
3) 调用s e l e c t函数,然后等待在指定的f d _ s e t集合中,I / O活动设置好一个或多个套接字句柄。
s e l e c t完成后,会返回在所有f d _ s e t集合中设置的套接字句柄总数,并对每个集合进行相应的更新。
4) 根据s e l e c t的返回值,我们的应用程序便可判断出哪些套接字存在着尚未完成(待决)的I / O操作—具体的方法是使用F D _ I S S E T宏,对每个f d _ s e t集合进行检查。
5) 知道了每个集合中“待决”的I / O操作之后,对I / O进行处理,然后返回步骤1 ),继续进行s e l e c t处理。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值