poll的使用
#define POLL_FD_SIZE 1024
int doServicePoll(int listenFd)
{
struct sockaddr_in cliAddr;
socklen_t len; int i;
struct pollfd pollFdSet[POLL_FD_SIZE];
for(i = ; i < POLL_FD_SIZE; i++) {
pollFdSet[i].fd = -;
}
pollFdSet[].fd = listenFd;
pollFdSet[].events = POLLIN; int pollRet;
int fdNum = ; //表示数组的下标 int acceptFd;
int readNum;
while() {
pollRet = poll(pollFdSet, fdNum + , ); //fdNum + 1表示数组的界限
if(pollRet < ) {
if(errno == EINTR) continue;
ERR_EXIT("poll");
} else if(pollRet == ) {
continue;
}
if(pollFdSet[].revents & POLLIN) { //注意点 是& 而不是==
memset(&cliAddr, , sizeof(cliAddr));
len = sizeof(cliAddr);
if((acceptFd = accept(pollFdSet[].fd, (struct sockaddr *)&cliAddr, &len)) < ) {
ERR_EXIT("accept");
}
printf("recv a connect from %s, port %d, fd %d\n",
inet_ntoa(cliAddr.sin_addr), ntohs(cliAddr.sin_port), acceptFd);
for(i = ; i < (POLL_FD_SIZE -); i++) {
if(pollFdSet[i].fd == -) {
pollFdSet[i].fd = acceptFd;
pollFdSet[i].events = POLLIN;
if(i > fdNum) {
fdNum = i;
}
break;
}
}
if(i == POLL_FD_SIZE -) {
ERR_EXIT("too many clients!");
}
if(--pollRet == ) continue;
} for(i = ; i < (fdNum +); i++) {
if(pollFdSet[i].fd < ) {
continue;
}
if(pollFdSet[i].revents & POLLIN) { //注意点 是& 而不是==
printf("need recv msg\n");
readNum = handleRead(pollFdSet[i].fd);
if(readNum == READ_ERROR) {
ERR_EXIT("handleRead");
} else if(readNum == READ_CLOSE) {
close(pollFdSet[i].fd);
printf("client closed, remove %d\n", i);
pollFdSet[i].fd = -;
if(i == fdNum) {
fdNum--;
}
}
if(--pollRet == ) {
break;
}
}
}
}
}
注意点:
1 pollFdSet[i].fd == -1 是判断是否需要监听的条件。
2 fdNum是表示监听描述符的个数。
3 判断是否可读 是通过 pollFdSet[i].revents & POLLIN 是否为真来表示的,其他可写等亦如此。
poll的使用的更多相关文章
- select、poll、epoll之间的区别总结
select.poll.epoll之间的区别总结 05/05. 2014 select,poll,epoll都是IO多路复用的机制.I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪 ...
- (转载) Linux IO模式及 select、poll、epoll详解
注:本文是对众多博客的学习和总结,可能存在理解错误.请带着怀疑的眼光,同时如果有错误希望能指出. 同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案 ...
- linux下select/poll/epoll机制的比较
select.poll.epoll简介 epoll跟select都能提供多路I/O复用的解决方案.在现在的Linux内核里有都能够支持,其中epoll是Linux所特有,而select则应该是POSI ...
- select,epoll,poll比较
介绍和比较 http://www.cnblogs.com/maociping/p/5132583.html 比较 http://www.dataguru.cn/thread-336032-1-1.ht ...
- linux poll函数
poll函数与select函数差不多 函数原型: #include <poll.h> int poll(struct pollfd fd[], nfds_t nfds, int timeo ...
- poll机制
使用POLL机制代替linux输入子系统(input subsystem)之按键输入和LED控制中的异步通知,实现同样的效果. 1.代码 只简单修改input_subsys_test.c, input ...
- select、poll、epoll之间的区别总结[整理]
select,poll,epoll都是IO多路复用的机制.I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作.但select ...
- IO多路复用之poll总结
1.基本知识 poll的机制与select类似,与select在本质上没有多大差别,管理多个描述符也是进行轮询,根据描述符的状态进行处理,但是poll没有最大文件描述符数量的限制.poll和selec ...
- select、poll、epoll区别总结
1 本质上都是同步I/O 三者都是I/O复用,本质上都属于同步I/O.因为三者只是负责通知应用程序什么时候数据准备好了,实际的I/O操作还是在由应用程序处理:如果是异步I/O的话,实际I/O由内核处理 ...
- 嵌入式Linux驱动学习之路(十二)按键驱动-poll机制
实现的功能是在读取按键信息的时候,如果没有产生按键,则程序休眠在read函数中,利用poll机制,可以在没有退出的情况下让程序自动退出. 下面的程序就是在读取按键信息的时候,如果5000ms内没有按键 ...
随机推荐
- C 标准库 - <locale.h>
C 标准库 - <locale.h> 简介 locale.h 头文件定义了特定地域的设置,比如日期格式和货币符号.接下来我们将介绍一些宏,以及一个重要的结构 struct lconv 和两 ...
- Android MPAndroidCharts 框架 画可滑动查看的直方图
1.由于公司项目的需求,所以花了1.2天研究 MPAndroidCharts框架 .可是发现好多博客对我都没得帮助.浪费非常多时间在百度上.不得不说google 真是比百度强太多了. 要求:统计出56 ...
- 实现iOS7上tableView的切割线像iOS6中的效果
iOS7上tableView的切割线左边短了一点,要实现和iOS6中的效果还是有方法的,UITableView头文件中个属性: @property (nonatomic) UIEdge ...
- 版本控制器 git
摘要:版本控制器是码农必备的工具,很多常用的,像svn,git,cvs等,工作中用过svn,Tortoisehg,firefly,其实大同小异,现在简单介绍下git,以及它的一些常用命令. 在wind ...
- CSS伪类:before 和 :after
CSS用了许久,对一些伪类熟视无睹,从不想着去搞清楚一下.比如说这个 :before :after 其实,:before 表示该标记前面的样式,反之 :after 代表设置后面的样式.网页上常常看到有 ...
- 记录一次MySQL两千万数据的大表优化解决过程,提供三种解决方案(转)
问题概述 使用阿里云rds for MySQL数据库(就是MySQL5.6版本),有个用户上网记录表6个月的数据量近2000万,保留最近一年的数据量达到4000万,查询速度极慢,日常卡死.严重影响业务 ...
- Delphi 7以来的Delphi 2009测试版新语法特性
我晕,Delphi 7 以后增加了这么多有用的语法,我都不知道.真是越学越觉得自己浅薄,自己所作的Delphi项目所用的知识还不够Delphi知识储备体系的十分之一,更别说Delphi还在继续发展. ...
- LeetCode(83)Remove Duplicates from Sorted List
题目 Given a sorted linked list, delete all duplicates such that each element appear only once. For ex ...
- git基本操作---持续更新(2017-08-11)
git 强制push $ git push -u origin master -f 查看本地标签 $ git tag 打标签并添加备注 $ git tag 20170811 -m"图片保存多 ...
- CAN协议与CANOpen协议
这里详细介绍了CAN协议中数据通信帧每位的含义,有图片,值得一看:https://www.cnblogs.com/pejoicen/p/3986587.html 这里介绍了CanOpen协议,http ...