|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
% P# r/ U; B$ J0 N p+ c# a7 a1.select函数简介
8 T6 ?& Y2 m, X% u" N3 p/ W# }5 E2 z: H- K+ u+ @
int select(int maxfdp,fd_set *readfds,fd_set *writefds,fd_set *erroRFds,struct timeval*timeout);
" ~: W8 \# D5 `! a
( z" k2 ^( D# F" h) v当服务器响应多个客户端连接的时候,需要定义一个线程函数,在每一个线程函数里面处理该连接,进行数据的读写,且connect、accept、recv或recvfrom这样的函数都是阻塞的。
; w' [) _2 U- f7 l( o: c0 P
- J* b; o, W, t* ~现在想不用线程函数就实现服务器响应多个客户端的连接,就可以使用select函数,且是非阻塞的,可以查询是哪个客户端的响应。: r' L }4 B, H/ a3 ]4 I
5 f: F( i4 b# N: c8 } H2 A参数maxfd是需要监视的最大的文件描述符值+1; A5 v) b! b& y- ^
rdset,wrset,exset分别对应于需要检测的可读文件描述符的集合,可写文件描述符的集 合及异常文件描述符的集合。
! ^6 W8 s1 N3 m; d5 Hstruct timeval结构用于描述一段时间长度,如果在这个时间内,需要监视的描述符没有事件发生则函数返回,返回值为0。 0 @3 P3 r" }4 H# g! A( a
fd_set(它比较重要所以先介绍一下)是一组文件描述字(fd)的集合,它用一位来表示一个fd(下面会仔细介绍),对于fd_set类型通过下面四个宏来操作:
& m0 P' H& _! E, K U9 JFD_ZERO(fd_set *fdset);将指定的文件描述符集清空,在对文件描述符集合进行设置前,必须对其进行初始化,如果不清空,由于在系统分配内存空间后,通常并不作清空处理,所以结果是不可知的。 7 z" y' f2 ?" f' [9 e% ]+ L
FD_SET(fd_set *fdset);用于在文件描述符集合中增加一个新的文件描述符。
: O4 S% X( c. Q1 Z: k; zFD_CLR(fd_set *fdset);用于在文件描述符集合中删除一个文件描述符。 # q7 E2 n) T$ n3 r
FD_ISSET(int fd,fd_set *fdset);用于测试指定的文件描述符是否在该集合中。8 {( F# }* M" s% D
2.用select实现服务器响应多个客户端的连接。
|$ _5 z. q# Z2 `# G! Z- N5 m- g, S5 @# @$ D: _
; [- Q1 h8 P3 S |
|