网络编程实用教程_第7章.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第7章 Winsock的输入/输出模型 第6章已经提到,WinSock在进行输入输出的时候,可以采用阻塞模式或非阻塞模式。使用非阻塞套接字,带有I/O操作的随机性,使非阻塞套接字难于操作,给编程带来困难。为解决这个问题,对于非阻塞的套接字工作模式,进一步引入了五种“套接字I/O模型”,它们有助于应用程序通过一种异步方式,同时对一个或多个套接字上进行的通信加以管理。 这些模型包括: · select(选择) · WSAAsyncSelect(异步选择) · WSAEventSelect(事件选择) · Overlapped I/O(重叠式I/O) · Completion port(完成端口) 不同的Windows平台支持不同的I/O模型。如表7.1所示: 表7.1 操作系统对套接字I/O模型的支持情况 平台 选择 异步选择 事件选择 重叠式I/O 完成端口 Windows CE 支持 不支持 不支持 不支持 不支持 Windows 95 (WinSock1) 支持 支持 不支持 不支持 不支持 Windows 95 (WinSock2) 支持 支持 支持 支持 不支持 Windows 98 支持 支持 支持 支持 不支持 Windows NT 支持 支持 支持 支持 支持 Windows 2000 支持 支持 支持 支持 支持 7.1 select模型 select(选择)模型是Winsock中最常见的I/O模型。它的中心思想是利用select函数,实现对多个套接字I/O的管理。利用select函数,可以判断套接字上是否存在数据,或者能否向一个套接字写入数据。只有在条件满足时,才对套接字进行输入输出操作,从而避免无功而返的I/O函数调用,避免频繁产生WSAEWOULDBLOCK错误,使输入输出变得有序。 1.select的函数 select的函数原型如下,其中fd_set数据类型,代表着一系列特定套接字的集合。 int select( int nfds, fd_set FAR * readfds, fd_set FAR * writefds, fd_set FAR * exceptfds, const struct timeval FAR * timeout ); 2.操作套接字集合的宏 在应用程序中,用select对套接字进行监视之前,必须先将要检查的套接字句柄分配给某个集合,设置好相应的fd_set结构,再来调用select函数,便可知道一个套接字上是否正在发生上述的I/O活动。 Winsock提供了4个宏操作,专门对fd_set数据类型进行操作 (1)FD_CLR(s, *set):从set中删除套接字s。 (2)FD_ISSET(s, *set):检查s是否set集合的一名成员;如果是,则返回TRUE。 (3)FD_SET(s, *set):将套接字s加入集合set。 (4)FD_ZERO ( *set):将set初始化成空集合。 其中,参数s是一个要检查的套接字,参数set是一个fd_set集合类型的指针。 例如,调用select函数前,可使用FD_SET宏,将指定的套接字加入到fd_read集合中,select函数完成后,可使用FD_ISSET宏,来检查该套接字是否仍在fd_read集合中。 3.select模型的操作步骤 用select操作一个或多个套接字句柄,一般采用下述步骤: (1)使用FD_ZERO宏,初始化自己感兴趣的每一个fd_set集合。 (2)使用FD_SET宏,将要检查的套接字句柄添加到自己感兴趣的每个fd_set集合中,相当在指定的fd_set集合中,设置好要检查的I/O活动。 (3)调用select函数,然后等待。select完成返回后,会修改每个fd_set结构,删除那些不存在待决I/O操作的套接字句柄,在各个fd_set集合中返回符合条件的套接字。 (4)根据select的返回值,使用FD_ISSET宏,对每个fd_set集合进行检查,判断一个特定的套接字是否仍在集合中,便可判断出哪些套接字存在尚未完成(待决)的I/O操作。 (5)知道了每个集合中“待决”的I/O操作之后,对相应的套接字的I/O进行处理,然后返回步骤1,继续进行select处理。 7.2 WSAAsyncSelect异步I/O模型 异步I/O模型通过调用WSAAsyncSelect()函数实现。利用这个模型,应用程序可在一个套接字上,接收以Windows消息为基础的网络事件通知。该模型最早出现于Winsock的1.1中,以适应其多任务消息环境。 1.WSAAsyncSelect函数 函数的定义是: int WSAAsyncSelect( S

文档评论(0)

精品文库 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档