大龙的博客

常用链接

统计

最新评论

select模型 -----回顾一下

 select模型                                          

Winsock分别提供了套接字模式套接字I/O模型,可对一个套接字上的I/O行为加以控制。注意:套接字模式套接字I/O模型是无关的,套接字模型的出现是为了解决套接字模式存在的某些限制。

Winsock提供两种套接字模式:锁定和非锁定。

套接字I/O模型:SelectWSAAsyncSelectWSAEventSelectOverlapped I/OCompletion Port(完成端口)等

前一段时间已经对Winsock的一些基本函数进行了学习,估计和我一样的初学者已经都看过了这些函数,只是在应用上还存在一些问题,今天我只是在这里介绍一下Select模型,我所写内容也是借鉴别人的经验和别人的一些知识,有错误的地方还需各位指正。

Select模型:

这个模型的目的就是为了,防止应用程序在套接字处于锁定模式中时,在一次I/O绑定调用过程中,被迫进入锁定状态,同时又是防止在套接字处于非锁定状态时,产生WSAEWOULDBLOCK错误。

select函数:

int select

     int nfdsfb_set FAR * readfds, fb_set FAR * writefds, fb_set FAR * exceptfds, const struct timeval FAR * timeout);

其中,第一个参数n f d s会被忽略。之所以仍然要提供这个参数,只是为了保持与早期的B e r k e l e y套接字应用程序的兼容。大家可注意到三个f d _ s e t参数:一个用于检查可读性(readfds),一个用于检查可写性(writefds),另一个用于例外数据(exceptfds)。从根本上说,fb_set数据类型代表着一系列特定套接字的集合。其中, readfds集合包括符合下述任何一个条件的套接字:

■ 有数据可以读入。

■ 连接已经关闭、重设或中止。

■ 假如已调用了listen,而且一个连接正在建立,那么accept函数调用会成功。

writefds集合包括符合下述任何一个条件的套接字:

■ 有数据可以发出。

■ 如果已完成了对一个非锁定连接调用的处理,连接就会成功。

最后,exceptfds集合包括符合下述任何一个条件的套接字:

■ 假如已完成了对一个非锁定连接调用的处理,连接尝试就会失败。

■ 有带外(out-of-bandOOB)数据可供读取。

例如,假定我们想测试一个套接字是否“可读”,必须将自己的套接字增添到readfds集合,再等待select函数完成。s e l e c t完成之后,必须判断自己的套接字是否仍为readfds集合的一部分。若答案是肯定的,便表明该套接字“可读”,可立即着手从它上面读取数据。在三个参数中(readfdswritefdsexceptfds),任何两个都可以是空值( N U L L);但是,至少有一个不能为空值!在任何不为空的集合中,必须包含至少一个套接字句柄;否则, select函数便没有任何东西可以等待。最后一个参数timeout对应的是一个指针,它指向一个timeval结构,用于决定select最多等待I / O操作完成多久的时间。如timeout是一个空指针,那么select调用会无限期地“锁定”或停顿下去,直到至少有一个描述符符合指定的条件后结束。对timeval结构的定义如下:

Struct timeval

{

Long tv_sec;

Long tv_usec;

}

其中,tv_sec字段以秒为单位指定等待时间; tv_usec字段则以毫秒为单位指定等待时间。若将超时值设置为( 0 , 0),表明select会立即返回,允许应用程序对select操作进行“轮询”。出于对性能方面的考虑,应避免这样的设置。select成功完成后,会在fd_set结构中,返回刚好有未完成的I / O操作的所有套接字句柄的总量。若超过timeval设定的时间,便会返回0。不管由于什么原因,假如select调用失败,都会返回socket_error。用select对套接字进行监视之前,在自己的应用程序中,必须将套接字句柄分配给一个集合,设置好一个或全部读、写以及例外FD_SET结构.

主要涉及到几个宏操作:

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

FD_ZERO ( * set ):将s e t初始化成空集合。

posted on 2007-07-23 11:29 大龙 阅读(3053) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理