fdset()
#include <sys/select.h>
int FD_ZERO(fd_set *fdset);
int FD_SET(int fd, fd_set *fd_set);
int FD_ISSET(int fd, fd_set *fdset);
int FD_CLR(int fd, fd_set *fdset);
(1)执行FD_ZERO(&fdset),则set用位表示是00000000,就是所有位都清空成0,一般刚开始的时候就需要清空。
(2)执行FD_SET(fd,&fdset),若fd=5,后set变为00010000,第5位置为1,就是将客户端连接的描述字(一般就是一个整数啦)放入到set当中。
(3)执行FD_ISSET(fd,&fdset),若fd=5,则就是判断set的第5位是否是1,一般用来判断是否客户端的连接。
(4)执行FD_CLR(fd,&fdset),若fd=5,则就是将第5位置成0,在断开客户端连接的时候,一定要记得调用这个。
原型
int select(int maxfdp,
fd_set *readset,
fd_set *writeset,
fd_set *exceptset,
struct timeval *timeout);
maxfdp :被监听的文件描述符的总数,它比所有文件描述符集合中的文件描述符的最大值大1,因为文件描述符是从0开始计数的;
是指集合中所有文件描述符的范围, 在Windows中这个参数的值无所谓,可以设置不正确。
fd_set *readset : 该参数是我们所关心的文件是否可读的文件描述符的集合,如果这个集合中有个文件可读了,那select返回一个大于0的数,表示有文件可读了,比如说服务端接收到客户端的数据,服务端都是读的状态,所以正常读的文件都放在这里。
fd_set writeset :那这个大家就比较好理解了,服务端发到客户端的数据,要写入到缓冲区,那么所有正常写*的文件都放在这里。
fd_set *exceptset :在所有正常读和正常写的时候,产生了异常情况,那么异常文件就放在这里。
timeval *timeout :用于设置select函数的超时时间,即告诉内核select等待多长时间之后就放弃等待。这个参数使select处于三种状态:(1)timeout传入NULL,则select一直等到文件状态有变化时才返回,这段时间一直处于阻塞状态。(2):timeout传入0,则select会立即返回(非阻塞),如果文件状态有变化则返回一个大于0的值没有变化则返回0;(3)timeout传入一个大于0的数,则select在timeout时间内阻塞,一旦文件状态有变化就会返回,超时后不管怎样都会返回值同样是文件状态右边话就返回一个大于0的值,无变化则返回0;
timeval结构体定义如下:
struct timeval
{
long tv_sec; /*秒 */
long tv_usec; /*微秒 */
};