本节学习内容
1.I/O复用的作用
2.select接口(1.select接口的作用2.select相关接口3.select编程流程4.代码实现select)
3.poll接口
4.select与poll对比
一、I/O复用的作用
I/O复用使得程序同时监听多个文件描述符。(简单说:I/O复用相当于监视发送端谁有数据,有数据再去处理,从而做到类似于多线程编程)
二、select接口
1.select接口的作用
1)select只会监听三类事件(读、写、异常)
2)select只有LT操作模式(电平触发模式)
3)select接口流程:
第一步:监听文件描述符是否就绪
第二步:将就绪的文件描述符存放到fd_set集合中
第三步:检测fd_set中是否有文件描述符被设置
第四步:如果有,处理文件描述符中的事件(如果此过程产生新的描述符,将新描述符送至第二步)
第五步:所有事件处理完,关闭端口。
2.select相关接口
FD_ZERO( fd _ set* fdset); // 清除 fdset的所有位
FD_SET( int fd, fd _ set* fdset); // 将文件描述符添加到fdsrt中,对应位置值置1
FD_CLR( int fd, fd _ set* fdset); // 清除 fdset某一个位
int FD_ISSET( int fd, fd _ set* fdset);// 测试 fdset的位 fd 是否被设置
3.select编程流程(服务器端)
步骤:
1)创建套接字(指定端口、监听)
2)创建文件描述符(将套接字加入到文件描述符中)
3)创建fd_set集合(将文件描述符加到fd_set集合中)
4)创建select接口来监听文件描述符(如果文件描述符未就绪,阻塞)
5)文件描述符已就绪,判断文件描述符(连接套接字还是接收套接字)
6)连接套接字:接受内容并回复
接受套接字:将接受套接字将其转化为连接套接字从 2)步骤重新开始
7)关闭
4.代码实现select
服务器端:
客户端:
运行结果如下
三、poll接口
1.poll的作用
poll与select相似,也是一定时间内轮询一定数量的文件描述符,以测试其中是否就绪
不同:
(1)poll支持的事件类型更多
(2)不用像select一样有fdset集合,只用维护好poll数组(结构体)即可
2.poll支持的事件类型
3.代码实现poll
服务器端:
客户端代码与select客户端相同
结果如下
四、select与poll对比
相同点:
1.每次循环都要将所有描述符拷贝到内核空间
2.内核的实现方式都是 轮询 时间复杂度为O(n)
3.都是通过遍历所有描述符来找到就绪描述符 时间复杂度O(n)
4.都只有LE操作模式(电平操作)
不同点:
1.select只能处理三类事件(读、写、异常),poll可以处理多种时间(如上图poll事件表)
2.poll不需要创建fd_set集合,只需要定义poll结构体维护好poll数组即可