select多路IO转接
1.原理:借助内核,select监听,客户端连接,数据通信事件
2.#include <sys/select.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
int select(int nfds, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds, struct timeval *timeout);
void FD_CLR(int fd, fd_set *set);
int FD_ISSET(int fd, fd_set *set);
void FD_SET(int fd, fd_set *set);
void FD_ZERO(fd_set *set);
①void FD_ZERO(fd_set *set) ------清空一个描述符集合
fd_set rset;
FD_ZERO(&rset);
②void FD_SET(int fd, fd_set *set) -------将待监听的文件描述符,添加到监听集合中
FD_SET(3, &rset);
FD_SET(12, &rset);
FD_SET(4, &rset);
③void FD_CLR(int fd, fd_set *set);------将一个文件描述符从监听集合中移除
FD_CLR(4,&rset);
④int FD_ISSET(int fd, fd_set *set);-----判断一个文件描述符是否在监听集合中
FD_ISSET(3,&rset)
⑤ int select(int nfds, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds, struct timeval *timeout);
nfds:监听的所有文件描述符中,最大的描述符+1
readfds:读 文件描述符监听集合 传入传出参数
writefds: 写 文件描述符监听集合 NULL 传入传出参数
exceptfds:异常 文件描述符监听集合 NULL 传入传出参数
timeout:>0 设置监听超时时长
NULL:阻塞监听
0:非阻塞监听,轮询
返回值:>0:所有监听集合中,满足对应事件的总数
0:没有满足监听事件的文件描述符
-1:error
select优缺点:
缺点:①监听上限受文件描述符限制,最大1024②检测条件满足的fd,自己添加业务逻辑提高小,提高了编码难度
优点:①跨平台完成文件描述符监听