网络编程实用教程 叶树华 高志红 网络编程实用教程_第8章

网络编程实用教程 叶树华 高志红 网络编程实用教程_第8章

ID:43776842

大小:451.50 KB

页数:26页

时间:2019-10-14

网络编程实用教程 叶树华 高志红 网络编程实用教程_第8章_第1页
网络编程实用教程 叶树华 高志红 网络编程实用教程_第8章_第2页
网络编程实用教程 叶树华 高志红 网络编程实用教程_第8章_第3页
网络编程实用教程 叶树华 高志红 网络编程实用教程_第8章_第4页
网络编程实用教程 叶树华 高志红 网络编程实用教程_第8章_第5页
资源描述:

《网络编程实用教程 叶树华 高志红 网络编程实用教程_第8章》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、第8章Winsock的输入/输出模型第7章已经提到,WinSock在进行输入输出的时候,可以采用阻塞模式或非阻塞模式。使用非阻塞套接字,带有I/O操作的随机性,使非阻塞套接字难于操作,给编程带来困难。为解决这个问题,对于非阻塞的套接字工作模式,进一步引入了五种“套接字I/O模型”,它们有助于应用程序通过一种异步方式,同时对一个或多个套接字上进行的通信加以管理。这些模型包括select(选择)、WSAAsyncSelect(异步选择)、WSAEventSelect(事件选择)、OverlappedI/O(重叠式I/O)以及Completionpo

2、rt(完成端口)。限于篇幅,本章将主要介绍前三种。不同的Windows平台支持不同的I/O模型。如表8.1所示:8.1select模型select(选择)模型是Winsock中最常见的I/O模型。它的中心思想是利用select函数,实现对多个套接字I/O的管理。利用select函数,可以判断套接字上是否存在数据,或者能否向一个套接字写入数据。只有在条件满足时,才对套接字进行输入输出操作,从而避免无功而返的I/O函数调用,避免频繁产生WSAEWOULDBLOCK错误,使输入输出变得有序。1.select的函数select的函数原型如下,其中fd_

3、set数据类型,代表着一系列特定套接字的集合。intselect(intnfds,fd_setFAR*readfds,fd_setFAR*writefds,fd_setFAR*exceptfds,conststructtimevalFAR*timeout);说明:select函数对readfds、writefds和exceptfds三个集合中指定的套接字进行检查,看是否有数据可读、可写或有带外数据,如果有至少一个套接字符合条件,就立即返回。符合条件的套接字仍在集合中,不符合条件的套接字则被删去。如果一个也没有,则等待。但最多等待timeout所

4、指定的时间,便返回。2.操作套接字集合的宏在应用程序中,用select对套接字进行监视之前,必须先将要检查的套接字句柄分配给某个集合,设置好相应的fd_set结构,再来调用select函数,便可知道一个套接字上是否正在发生上述的I/O活动。Winsock提供了下列宏操作,专门对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_ZE

5、RO(*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集合

6、中,相当在指定的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处理。4.举例

7、下面的例子用select管理一个套接字上的I/O操作。SOCKETs;//定义一个套接字fd_setfdread;//定义一个套接字集合变量intret;//返回值//创建一个套接字,并接受连接.......//管理该套接字上的输入/输出while(TRUE){//在调用select()之前,总是要清除套接字集合变量FD_ZERO(&fdread);//将套接字s添加到fdread集合中FD_SET(s,&fdread);//调用select()函数,并等待它的完成,这里只是想检查s是否有数据可读if((ret=select(0,&fdread

8、,NULL,NULL,NULL))==SOCKET_ERROR){//处理错误的代码}//返回值大于零,说明有符合条件的套接字,对于本例这个简单的情况

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。