- 1、本文档共15页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
网络select
套接口I/O状态查询——select(?) 一个套接口创建好后,默认处于阻塞状态。在使用send或recv等函数进行IO操作时,进程或线程被迫进入阻塞状态进行等待,直到这些操作可以完成。 使用select( )函数可以在进行IO操作之前,先判断能否向一个套接口写入数据,或者套接口上是否存在可读的数据。 函数作用:可以防止程序在套接口处于拥塞模式时,对它进行的IO操作被迫进入等待状态;也可以防止在非阻塞模式时,产生WSAEWOULDBLOCK错误。 1.函数格式 int select ( int nfds, fd_set FAR* readfds, fd_set FAR* writefds, fd_set FAR* exceptfds, const struct timeval FAR* timeout ); fd_set是一个结构类型,定义如下: struct fd_set { u_int fd_count; SOCKET fd_array[FD_SETSIZE]; } fd_set; fd_count表示套接口的数目; fd_array表示数组中存放的套接口号; FD_SETSIZE是常量,定义为64。 timeout:表示本次select(?)调用最长等待时间。 timeval是一个结构类型,它的定义如下: struct timeval { long tv_sec; /* seconds */ long tv_usec; /* and microseconds */ }; tv_sec字段和tv_usec字段都表示等待时间。 tv_sec字段以秒为单位,而tv_usec字段以毫秒为单位。 时间设置分为三种情况 将等待时间tv_sec和tv_usec都设置为0,则select(?)调用在检查完套接口描述符后立即返回。可用于探询所选套接口的状态。如果处于这种状态,则select(?)调用可认为是非阻塞的。 (2) 如果将timeout指向NULL,则进行阻塞等待。即被监视的套接口描述符中,只有当其中的任何一个准备好读写操作时,select(?)调用才返回。 (3) 如果等待时间tv_sec和tv_usec不全为0,则当等待时间没有超时时,select(?)函数在被检查的描述符中有任何一个套接口准备好读写时返回。 3.函数返回信息 select函数对readfds、writefds和exceptfds三个集合中指定的套接字进行检查,看是否有数据可读、可写或有带外数据。 如果有至少一个套接字符合条件,就立即返回。符合条件的套接字仍在集合中,不符合条件的套接字则被删去。 如果一个也没有,则等待。但最多等待timeout所指定的时间,便返回,返回0值; 如果发生错误,则返回SOCKET_ERROR,应用程序可通过WSAGetLastError(?)获取错误代码。 4.select( )函数使用说明 select(?)函数可用于检查一个或多个套接口的状态。 对每一个套接口,调用者可查询它的可读性、可写性及错误状态信息。 用fd_set结构来表示一组等待检查的套接口,在调用返回时,这个结构存有满足一定条件的套接口组的子集,并且select(?)返回满足条件的套接口的数目。 例如:假定想测试一个套接口是否“可读”,需要进行的大概步骤为: 首先将该套接口添加到readfds集合中 然后执行select函数,等待它完成 Select返回后,必须检查该套接口是否仍在readfds集合中。 若在,就说明该套接口有数据可读,可立即从它读取数据。 WaitForEchoReply( ) 为了便于对readfds、writefds和exceptfds集合进行操作,简化程序的设计, Winsock实现中已经定义好了4个宏: FD_SET(s,*set):向set集合添加套接口s。 FD_CLR(s,*set):从set集合中删除套接口s。 FD_ISSET(s,*set):检查s是否为set集合中的一员,如果是则返回“真”(TRUE)。 FD_ZERO(*set):将set集合初始化为空集。 可以在程序中直接使用它们对集合进行设置。 select函数对一个或多个套接口进行检查的过程 用select对套接字进行监视之前,必须先将要检查的套接字分配给某个集合,设置好相应的fd_set结构,再调用select函数,便可知道一个套接字上是否正在发生上述I/O活动。 (1) 使用FD_ZERO宏,初始化要检查的每一个集合
文档评论(0)