- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
试验3 SELECT I / O模型服务端的程序实现
通过这次试验,要掌握Winsock提供了两种套接字模式:锁定和非锁定,一个应用程序如何通过它们管理I / O,Winsock提供了一些I / O模型,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错误。
相关内容说明
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中,它使那些想避免在套接字调用过程中被无辜“锁定”的应用程序,采取一种有序的方式,同时进行对多个套接字的管理。由于Winsock 1.1向后兼容于B e r k e l e y套接字实施方案,所以假如有一个B e r k e l e y套接字应用使用了s e l e c t函数,毋需对其进行任何修改,便可正常运行。利用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的函数原型如下:
其中,第一个参数n f d s忽略。只是为了保持与早期的B e r k e l e y套接字应用程序的兼容。大家可注意到三个f d _ s e t参数:一个用于检查可读性(r e a d f d s),一个用于检查可写性(w r i t e f d s),另一个用于例外数据(e x c e p t f d s)。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集合,再等待s e l e c t函数完成。s e l e c t完成之后,必须判断自己的套接字是否仍为r e a d f d s集合的一部分。若答案是肯定的,便表明该套接字“可读”,可立即着手从它上面读取数据。在三个参数中(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调用会无限期地“锁定”或停顿下去,直到至少有一个描述符符合指定的条件后结束。对t i m e v a l结构的定义如下:
其中,t v _ s e c字段以秒为单位指定等待时间; t v _ u s e c字段则以毫秒为单位指定等待时间。
若将超时值设置为( 0 , 0),表明s e l e c t会立即返回,允许应用程序对s e l e c t操作进行“轮询”。出于对性能方面的考虑,应避免这样的设置。
文档评论(0)