一、select函数认识
nfds:是需要监视的最大的文件描述符的值加1。
readfds:(可选)指针,指向一组等待可读性检查的套接口。
writefds:(可选)指针,指向一组等待可写性检查的套接口。
exceptfds:(可选)指针,指向一组等待错误检查的套接口。
timeout:select()最多等待时间,对阻塞操作则为NULL。
timeout为结构timeval,用来设置select()的等待时间,其结构定义如下
struct timeval
{
long tv_sec; //second 秒
long tv_usec; //microsecond 微妙
};
FD_CLR 从集合中删除某个描述字。
FD_ISSET 判断某个文件描述符是否为真。
FD_SET 向集合添加描述字。
FD_ZERO 将集合初始化为空集NULL。
select()调用返回处于就绪状态并且已经包含在fd_set结构中的描述字总数;如果超时则返回0;否则的话,返回SOCKET_ERROR错误。
二、select模型认识
select模型属于网络的I/O复用模型,比纯粹的阻塞I/O模型更具有实用性,因为可以同时等待多个描述字的就绪,它的底层是通过位图来实现的,默认情况下一般可表示1024个文件描述符。
客户端:
服务器端:
运行结果:
select缺点:
(1)每次调⽤用select,都需要把fd集合从⽤用户态拷贝到内核态,这个开销在fd很多时会很⼤大
(2)同时每次调⽤用select都需要在内核遍历传递进来的所有fd,这个开销在fd很多时也很⼤大
(3)select⽀支持的⽂文件描述符数量太⼩小了,默认是1024