- 0
- 0
- 约5.15千字
- 约 34页
- 2019-09-10 发布于辽宁
- 举报
第8章 Winsock的输入/输出模型 第7章已经提到,WinSock在进行输入输出的时候,可以采用阻塞模式或非阻塞模式。使用非阻塞套接字,带有I/O操作的随机性,使非阻塞套接字难于操作,给编程带来困难。为解决这个问题,对于非阻塞的套接字工作模式,进一步引入了五种“套接字I/O模型”,它们有助于应用程序通过一种异步方式,同时对一个或多个套接字上进行的通信加以管理。 这些模型包括 select(选择)、 WSAAsyncSelect(异步选择)、 WSAEventSelect(事件选择)、 Overlapped I/O(重叠式I/O) 以及Completion port(完成端口)。 限于篇幅,本章将主要介绍前三种。 不同的Windows平台支持不同的I/O模型。如表8.1所示: 8.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 ); 说明:select函数对readfds、writefds和exceptfds三个集合中指定的套接字进行检查,看是否有数据可读、可写或有带外数据,如果有至少一个套接字符合条件,就立即返回。符合条件的套接字仍在集合中,不符合条件的套接字则被删去。如果一个也没有,则等待。但最多等待timeout所指定的时间,便返回。 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_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处理。 4.举例 下面的例子用select管理一个套接字上的I/O操作。 SOCKET s; //定义一个套接字 fd_set fdread; //定义一个套接字集合变量 int ret; //返回值 //创建一个套接字,并接受连接 ....... // 管理该套接字上的输入/输出 while(TRUE) { //在调用select()之前,总是要清除套接字集合变量 FD_ZERO(fdread); //将套接字 s 添加到fdread集合中 FD_SET(s,
您可能关注的文档
最近下载
- XX村新任支部书记任职发言稿.docx VIP
- 2024高端装备制造业技术升级改造合同.docx VIP
- 603A使用说明书.doc VIP
- 江苏图集-JS2016Q5 住宅厨卫组合变压式耐火排烟气道系统 江苏省工程建设企业标准设计图集.pdf VIP
- 初中地理会考填图专项练习含答案.pdf VIP
- 智能汽车胎压监测系统的设计.doc VIP
- GB+30871-2022国家新标准规范.pdf VIP
- 晚期宫颈癌患者突然大出血应急演练及脚本.docx VIP
- 08G101-5 混凝土结构施工图平面整体表示方法制图规则和构造详图(箱形基础和地下室结构).docx VIP
- 11G329-1 建筑物抗震构造详图.docx VIP
原创力文档

文档评论(0)