|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
2 F. B+ f/ w u# d/ u- G- n
1.select函数简介
# }6 z$ t7 T" y" r$ T$ E% `- d+ u; D" c, Q; n5 {
int select(int maxfdp,fd_set *readfds,fd_set *writefds,fd_set *erroRFds,struct timeval*timeout);
3 h7 N1 ?! q) Y4 {6 Y4 c A5 W5 \/ w F; Q1 l; w/ R6 b, i+ o, N
当服务器响应多个客户端连接的时候,需要定义一个线程函数,在每一个线程函数里面处理该连接,进行数据的读写,且connect、accept、recv或recvfrom这样的函数都是阻塞的。
+ K4 y5 ? V" N9 ^0 r& n& n8 ~- g& J- a2 [& a4 {4 `1 f
现在想不用线程函数就实现服务器响应多个客户端的连接,就可以使用select函数,且是非阻塞的,可以查询是哪个客户端的响应。8 p5 x. f, t' X# b
- ^6 g: h% b- m7 e3 x0 `
参数maxfd是需要监视的最大的文件描述符值+1;
# C8 t4 P& @$ P) H+ prdset,wrset,exset分别对应于需要检测的可读文件描述符的集合,可写文件描述符的集 合及异常文件描述符的集合。 : A- A" u+ _+ J/ [9 u6 T
struct timeval结构用于描述一段时间长度,如果在这个时间内,需要监视的描述符没有事件发生则函数返回,返回值为0。
+ [( R8 M2 _0 ?* V, v/ t5 Wfd_set(它比较重要所以先介绍一下)是一组文件描述字(fd)的集合,它用一位来表示一个fd(下面会仔细介绍),对于fd_set类型通过下面四个宏来操作: " |& F8 ~2 U. _3 ^
FD_ZERO(fd_set *fdset);将指定的文件描述符集清空,在对文件描述符集合进行设置前,必须对其进行初始化,如果不清空,由于在系统分配内存空间后,通常并不作清空处理,所以结果是不可知的。 6 y0 B; g% t* o$ w& H$ Z
FD_SET(fd_set *fdset);用于在文件描述符集合中增加一个新的文件描述符。
. z& `1 S# Y2 P) t+ T% J I( uFD_CLR(fd_set *fdset);用于在文件描述符集合中删除一个文件描述符。 6 M2 H: ]5 r4 ?
FD_ISSET(int fd,fd_set *fdset);用于测试指定的文件描述符是否在该集合中。
4 z- J( o0 ~& f4 [. W2.用select实现服务器响应多个客户端的连接。6 D8 `" F3 k) ?0 ?
% O1 g# q1 `' ~1 V# S
% n" {- i) o1 [/ [5 x( j1 o |
|