#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的使用的更多相关文章

  1. select、poll、epoll之间的区别总结

    select.poll.epoll之间的区别总结 05/05. 2014 select,poll,epoll都是IO多路复用的机制.I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪 ...

  2. (转载) Linux IO模式及 select、poll、epoll详解

    注:本文是对众多博客的学习和总结,可能存在理解错误.请带着怀疑的眼光,同时如果有错误希望能指出. 同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案 ...

  3. linux下select/poll/epoll机制的比较

    select.poll.epoll简介 epoll跟select都能提供多路I/O复用的解决方案.在现在的Linux内核里有都能够支持,其中epoll是Linux所特有,而select则应该是POSI ...

  4. select,epoll,poll比较

    介绍和比较 http://www.cnblogs.com/maociping/p/5132583.html 比较 http://www.dataguru.cn/thread-336032-1-1.ht ...

  5. linux poll函数

    poll函数与select函数差不多 函数原型: #include <poll.h> int poll(struct pollfd fd[], nfds_t nfds, int timeo ...

  6. poll机制

    使用POLL机制代替linux输入子系统(input subsystem)之按键输入和LED控制中的异步通知,实现同样的效果. 1.代码 只简单修改input_subsys_test.c, input ...

  7. select、poll、epoll之间的区别总结[整理]

    select,poll,epoll都是IO多路复用的机制.I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作.但select ...

  8. IO多路复用之poll总结

    1.基本知识 poll的机制与select类似,与select在本质上没有多大差别,管理多个描述符也是进行轮询,根据描述符的状态进行处理,但是poll没有最大文件描述符数量的限制.poll和selec ...

  9. select、poll、epoll区别总结

    1 本质上都是同步I/O 三者都是I/O复用,本质上都属于同步I/O.因为三者只是负责通知应用程序什么时候数据准备好了,实际的I/O操作还是在由应用程序处理:如果是异步I/O的话,实际I/O由内核处理 ...

  10. 嵌入式Linux驱动学习之路(十二)按键驱动-poll机制

    实现的功能是在读取按键信息的时候,如果没有产生按键,则程序休眠在read函数中,利用poll机制,可以在没有退出的情况下让程序自动退出. 下面的程序就是在读取按键信息的时候,如果5000ms内没有按键 ...

随机推荐

  1. 关于 AlphaGo 论文的阅读笔记

    这是Deepmind 公司在2016年1月28日Nature 杂志发表论文 <Mastering the game of Go with deep neural networks and tre ...

  2. c++对象模型和对象内存布局

    简单对象模型:如下图所示: 每一个object是一系列的slots,每一个data member或者function member都有自己的一个slot.这种模型的空间和执行效率都很低.在这个模型中, ...

  3. ffmpeg rtmp 推流错误WriteN, RTMP send error 10053 10038

    利用ffmepg推264流到rtmp服务端出现错误WriteN, RTMP send error 10053,具体如下图所示. 图1推流到rtmp服务错误 原因是视频流缺少SPS,PPS信息,加上这两 ...

  4. MyEclipse的html/JSP编辑器添加代码自动提示

    http://lusterfly.iteye.com/blog/1872627 在myeclipse 9以前的版本中,我们如果要为html编辑器添加自动的代码提示可以这样操作: windows--&g ...

  5. 算法排序-NB三人组

    快速排序: 堆排序: 二叉树: 两种特殊二叉树: 二叉树的存储方式: 小结: 堆排序正题: 向下调整: 堆排序过程: 堆排序-内置模块: 扩展问题topk: 归并排序: 怎么使用: NB三人组小结

  6. MyBatis学习(二):与Spring整合(非注解方式配置MyBatis)

    搭建SpringMVC的-->传送门<-- 一.环境搭建: 目录结构: 引用的JAR包: 如果是Maven搭建的话,pom.xml的配置如下: <?xml version=" ...

  7. ios开发动物园管理 继承多态的实现

    // // main.m // 继承 // // #import <Foundation/Foundation.h> #import "Animal.h" #impor ...

  8. Linux 系统监控.诊断工具之 IO wait

    1. 常用组合方式有如下几种: 用vmstat.sar.iostat检测是否是CPU瓶颈 用free.vmstat检测是否是内存瓶颈 用iostat.dmesg 检测是否是磁盘I/O瓶颈 用netst ...

  9. LeetCode(155)题解--Min Stack

    https://leetcode.com/problems/min-stack/ 题目: Design a stack that supports push, pop, top, and retrie ...

  10. EasyPlayer Android安卓流媒体播放器实现播放同步录像功能实现(附源码)

    本文转自EasyDarwin团队John的博客:http://blog.csdn.net/jyt0551,John是EasyPusher安卓直播推流.EasyPlayer直播流媒体播放端的开发和维护者 ...