高级I/O---多路复用---poll
发表于:2025-12-03 作者:千家信息网编辑
千家信息网最后更新 2025年12月03日,稍加改进的多路复用--pollpoll是一个在select上稍加改进的多路复用版本,不久后就被功能完善的epoll所取代,它与select的区别在于select的返回通过输入参数来返回,这样每次都要添
千家信息网最后更新 2025年12月03日高级I/O---多路复用---poll
稍加改进的多路复用--poll
poll是一个在select上稍加改进的多路复用版本,不久后就被功能完善的epoll所取代,它与select的区别在于select的返回通过输入参数来返回,这样每次都要添加要关心的文件描述符到其文件描述符集中,而poll设置了一个结构体指针参数,通过他就可以知道状态变化,但免不了的是依旧需要遍历整个buf,它的大小可以由用户自定义,但是过于大的集合会使得服务器负担大大加重,而太小的集合又因为大多的socket都在等待数据到来,效率上又会下滑很多,所以poll很尴尬。
poll的函数
#includeint poll(struct pollfd *fds, nfds_t nfds, int timeout); struct pollfd { int fd; /* file descriptor */ short events; /* requested events */ short revents; /* returned events */ };
poll的函数与select不一样的地方就是它的fds参数,他是一个结构体指针,结构体的定义就是下面那个
struct pollfd,其中的events是设置的时候所要关心的时间,revents是输出当大于零的时候便说明发生了event所设置的情况,revents不用手动清空,他会自动清空。
因为和select差不多,就直接看代码吧
下面是实现的一个简单的poll版本的tcp服务器
因为前面的设置监听套接字和之前的都一样就忽略了
43 void PollServer(int sock) 44 { 45 int i=0; 46 int max_fd=-1; 47 struct pollfd fds[_MAX_FDS_]; 48 for(;i<_MAX_FDS_;i++) 49 { 50 fds[i].fd=-1; 51 } 52 fds[0].fd=sock; 53 max_fd=sock; 54 fds[0].events=POLLIN; //设置为所关心的事件 55 int timeout; 56 while(1) 57 { 58 int new_sock=-1; 59 60 struct sockaddr_in client; 61 socklen_t client_len=sizeof(client); 62 63 fds[0].fd=sock; 64 fds[0].events=POLLIN; 65 timeout=5000; 66 switch(poll(fds,max_fd+1,timeout))//依然需要循环 67 { 68 case -1: 69 perror("poll"); 70 continue; 71 case 0: 72 printf("timeout\n"); 73 continue; 74 default: 75 { 76 for(i=0;i<_MAX_FDS_;i++) 77 { 78 int fd=fds[i].fd; 79 if(fd==sock&&fds[i].revents>0) //当有新的连接时 80 { 81 new_sock=accept(sock,(struct sockaddr*)\ 82 &client,&client_len); 83 printf("%d\n",new_sock); 84 for(i=0;i<_MAX_FDS_;i++) 85 { 86 if(fds[i].fd<0) 87 { 88 fds[i].fd=new_sock; 89 fds[i].events=POLLIN; 90 break; 91 } 92 } 93 if(i==_MAX_FDS_) 94 { 95 close(new_sock); 96 } 97 } 98 else if(fd>0&&fds[i].revents>0) //当有需要读的数据时 99 {100 char buf[1024];101 memset(buf,'\0',sizeof(buf));102 ssize_t size=read(fd,buf,sizeof(buf)-1);103 if(size>0)104 {105 buf[size]='\0';106 printf("client::%s\n",buf);107 }else if(size==0){108 close(fd);109 fds[i].fd=-1;110 fds[i].events=-1;111 }else{112 perror("read");113 continue;114 }115 }116 }117 }118 }119 }120 }121poll和select的区别并不大,所以很快被epoll淘汰掉了
参数
结构
多路
复用
函数
就是
指针
数据
文件
时候
服务器
版本
服务
尴尬
差不多
不大
不用
事件
代码
功能
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
天空卫士网络技术
建设了网络安全监测技术手段
亚洲网络安全创新峰会
杀手6正在连接服务器进不去游戏
使用mongodb数据库的项目
如何使用云服务器下载视频
网络安全信息安全保障能力
基于社交网络技术研究
攻击游戏服务器视频
个体户 税收 软件开发
各地好的数据库漏洞扫描
网页版本数据库开发
饭卡管理系统连接数据库
菏泽戴尔服务器哪个系列好
长沙虚拟币软件开发
深圳智能巡检软件开发多少钱
现代诗歌 网络技术人才
汽车网络技术故障
计算机用数据库管理吗
gis软件开发公司名字
我们如何保护网络安全英语
华为笔记本邮箱无法连接服务器
网络安全包含哪几种类型
小学网络安全教育的教案
mysql数据库赋权限
网络技术学习计划表大学
战地1加入延迟低服务器
网络技术违法
普陀区品质软件开发报价方案
苏州戴尔服务器在哪里买