|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
: A- _. O0 t* Y. x0 o, o
1.select函数简介
Y: K( I3 {1 n' x: l6 r. H
$ r8 y6 n( k$ v; f8 H4 G3 Pint select(int maxfdp,fd_set *readfds,fd_set *writefds,fd_set *erroRFds,struct timeval*timeout);
: E9 O1 h5 }. [
$ |6 D' f% A% a当服务器响应多个客户端连接的时候,需要定义一个线程函数,在每一个线程函数里面处理该连接,进行数据的读写,且connect、accept、recv或recvfrom这样的函数都是阻塞的。6 W3 y* t. |6 ~8 ]7 E! K; s+ n
" v, Q! j7 S) w; Z2 B$ Y+ ?
现在想不用线程函数就实现服务器响应多个客户端的连接,就可以使用select函数,且是非阻塞的,可以查询是哪个客户端的响应。( Z( E" N& r$ C2 j. ?# p- _
, z# V) T* [% J9 @( V
参数maxfd是需要监视的最大的文件描述符值+1; ' I6 U' }1 `5 ?: i: L' `
rdset,wrset,exset分别对应于需要检测的可读文件描述符的集合,可写文件描述符的集 合及异常文件描述符的集合。
# z& L; b$ V. C7 T% f5 Kstruct timeval结构用于描述一段时间长度,如果在这个时间内,需要监视的描述符没有事件发生则函数返回,返回值为0。
) A; k! }, k1 w o: j5 c. g+ s9 N. Ffd_set(它比较重要所以先介绍一下)是一组文件描述字(fd)的集合,它用一位来表示一个fd(下面会仔细介绍),对于fd_set类型通过下面四个宏来操作:
y; ]) Z& k. Q9 }8 r' t0 MFD_ZERO(fd_set *fdset);将指定的文件描述符集清空,在对文件描述符集合进行设置前,必须对其进行初始化,如果不清空,由于在系统分配内存空间后,通常并不作清空处理,所以结果是不可知的。 9 j( @& a$ y' k; o' l
FD_SET(fd_set *fdset);用于在文件描述符集合中增加一个新的文件描述符。
* L7 T1 X! y) H _FD_CLR(fd_set *fdset);用于在文件描述符集合中删除一个文件描述符。 # K; Y2 z6 V* X, N9 w5 H
FD_ISSET(int fd,fd_set *fdset);用于测试指定的文件描述符是否在该集合中。) ]/ O- a9 f! N4 T, O; ]! F
2.用select实现服务器响应多个客户端的连接。, P& E# b% k& V$ `
; a. \/ ~2 F) L1 ~# {% [
, Q6 i, Y4 T4 A* {( J. ?
|
|