poll的使用与select使用差别:
- poll不需要自定义一个存放文件描述符的数组
- poll不需要自定义保存设置监听的集合
特点:
- 相比select,可设置的监听个数突破1024
- 监听、返回集合
- 搜索范围小
1 /*
2 头文件#include <poll.h>
3
4 原型:int poll(struct pollfd fds[], nfds_t nfds, int timeout);
5 struct pollfd{
6 int fd; 文件描述符
7 short events; 监控的事件
8 short revents; 监控事件中满足条件返回的事件
9 };
10 fds: 设置数组的首地址
11 nfds: 设置数组元素的个数
12 timeout:设置监控的时间
13
14 events:
15 POLLIN
16 POLLOUT
17 POLLERR
18 */
poll使用情况:
20 /*
21 //定义listenfd,connfd等套接字,serv_sockaddr端口号,IP的结构体
22
23 //自定义最大元素个数:
24 nfds_t maxno;
25
26 //定义clientfd结构体数组,并设置好监听事件
27 struct pollfd clientfd[20];
28 clientfd[0].fd=listenfd;
29 clientfd[0].events=POLLIN;
30
31 while
32 {
33 //监听是否有连接请求
34 poll(clientfd,maxno,0);
35 //如果监控事件中有POLLIN请求,则连接客户端
36 if(clientfd[0].revents & POLLIN){
37 connfd=accept();
38 for(遍历clientfd[]的空闲位置,存放connfd)
39 相应的clientfd[],数组下标设置好
40 }
41 for(遍历clientfd[]中的文件描述符){
42 if(判断是否有数据可读){
43 有则读取,读完关闭连接,相应的clientfd[],数组下标等数据调整
44 }
45 }
46 继续回到监听listenfd
47 }
48 */