转自http://www.cnblogs.com/zhuwbox/p/4222382.html

poll 与 select 很类似,都是对描述符进行遍历,查看是否有描述符就绪。如果有就返回就绪文件描述符的个数将。poll 函数如下:

  #include <poll.h>

  int poll(struct pollfd *fdarray, unsigned long nfds, int timeout)

  第一个参数指向结构数组第一个元素的指针,每个数组都是一个 pollfd 结构,用于指定测试某个给定描述符 fd 的条件。

  struct pollfd

  {

    int fd;

    short events;//关心 fd 上发生的事件

    short revents;//fd 实际上上发生的事件

  }

  要测试的条件由 events 成员指定,函数在相应的 revents 成员中返回该描述符的状态(每个描述符都有两个变量,一个为调用值,另一个为返回结果,从而避免值-结果参数)这两个成员中的每一个都由指定某个特定条件的一位或多位组合而成。下标列出指定 events 标志以及测试 revents 标志的一些常值。

  ----------------------------+---------------------------------------+---------------------------------------+----------------------------------------+

     常量         |  能做为 events 的输入吗?    | 能作为revents 的结果吗? | 说明             |

  ----------------------------+---------------------------------------+---------------------------------------+----------------------------------------+

         POLLIN      |    能         |       能      |  普通或者优先级带数据可读    |

         POLLRDNORM    |    能         |       能      |  普通数据可读          |

     POLLRDBAND          |    能         |       能      |  优先级带数据可读        |

         POLLPRI      |    能         |       能      |  高优先级数据可读      |

  ----------------------------+---------------------------------------+---------------------------------------+----------------------------------------+

         POLLOUT       |    能         |       能      | 普通数据可写           |

         POLLWRNORM   |    能         |       能      | 普通数据可写        |

  POLLWRBAND    |    能         |       能      | 优先级带数据可写      |

  ----------------------------+---------------------------------------+--------------------------------------+-----------------------------------------+

         POLLERR       |              |       能      | 发生错误          |

         POLLHUP       |              |       能      | 发生挂起          |

  POLLNVAL                |              |         能      | 描述字不是一个打开的文件     |

  -----------------------------+--------------------------------------+---------------------------------------+----------------------------------------+

  第二个参数 nfds 制定数组中元素个数。第三个参数指定 poll 函数返回前等待多长时间。 INFTIM 表示永远等待, 0 代表立即返回, > 0 等待指定数目的秒数。

#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <error.h>
#include <errno.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <limits.h>
#include <poll.h>
#include <sys/stropts.h>
#include <signal.h>
#define MAXLINE 5
#define OPEN_MAX 1024
#define SA struct sockaddr int main()
{
int listenfd, connfd, sockfd, i, maxi;
int nready;
socklen_t clilen;
ssize_t n;
char buf[MAXLINE];
struct pollfd client[OPEN_MAX];
struct sockaddr_in servaddr, cliaddr;
//创建监听套接字
if((listenfd = socket(AF_INET, SOCK_STREAM, )) < )
{
printf("socket() error!");
exit();
}
//先要对协议地址进行清零
bzero(&servaddr,sizeof(servaddr));
//设置为 IPv4 or IPv6
servaddr.sin_family = AF_INET;
//绑定本地端口号
servaddr.sin_port = htons();
//任何一个 IP 地址,让内核自行选择
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
//绑定套接口到本地协议地址
if(bind(listenfd, (SA *) &servaddr,sizeof(servaddr)) < )
{
printf("bind() error!");
exit();
}
//服务器开始监听
if(listen(listenfd,) < )
{
printf("listen() error!");
exit();
}
client[].fd = listenfd;
client[].events = POLLRDNORM;//关心监听套机字的读事件
for(i = ; i < OPEN_MAX; ++i)
{
client[i].fd = -;
}
maxi = ;
for(;;)
{
nready = poll(client, maxi + , -);
if(client[].revents & POLLRDNORM)
{
clilen = sizeof(cliaddr);
//accept 的后面两个参数都是值-结果参数,他们的保留的远程连接电脑的信息,如果不管新远程连接电脑的信息,可以将这两个参数设置为 NULL
connfd = accept(listenfd, (SA *) &cliaddr, &clilen);
if(connfd < )
{
continue;
}
for(i = ; i < OPEN_MAX; ++i)
{
if(client[i].fd < )
client[i].fd = connfd;
break;
}
if(i == OPEN_MAX)
{
printf("too many clients");
exit();
}
client[i].events = POLLRDNORM;
if(i > maxi)
{
maxi = i;
}
if(--nready <= )
continue;
}
for(i = ; i < OPEN_MAX; ++i)
{
if((sockfd = client[i].fd) < )
{
continue;
}
if(client[i].revents & POLLRDNORM | POLLERR)
{
if((n = read(sockfd, buf, MAXLINE)) < )
{
if(errno == ECONNRESET)
{
close(sockfd);
client[i].fd = -;
}
else
{
printf("read error!\n");
}
}
else if(n == )
{
close(sockfd);
client[i].fd = -;
}
else
{
write(sockfd, buf, n);
}
if(--nready <= )
break;
}
}
}
}

linux/unix网络编程之 poll的更多相关文章

  1. linux/unix网络编程之 select

    转自http://www.cnblogs.com/zhuwbox/p/4221934.html linux 下的 select 知识点 unp 的第六章已经描述的很清楚,我们这里简单的说下 selec ...

  2. linux/unix网络编程之epoll

    转载自 Linux epoll模型 ,这篇文章讲的非常详细! 定义: epoll是Linux内核为处理大批句柄而作改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显 ...

  3. Linux/Unix C编程之的perror函数,strerror函数,errno

    #include <stdio.h> // void perror(const char *msg); #include <string.h> // char *strerro ...

  4. unix网络编程之listen()详解

    转自于:http://blog.csdn.net/ordeder/article/details/21551567 Unix网络编程描述如下: #include <sys/socket.h> ...

  5. unix下网络编程之I/O复用(三)

    poll函数 在上文unix下网络编程之I/O复用(二)中已经介绍了select函数的相关使用,本文将介绍另一个常用的I/O复用函数poll.poll提供的功能与select类似,不过在处理流设备时, ...

  6. linux网络编程之shutdown() 与 close()函数详解

    linux网络编程之shutdown() 与 close()函数详解 参考TCPIP网络编程和UNP: shutdown函数不能关闭套接字,只能关闭输入和输出流,然后发送EOF,假设套接字为A,那么这 ...

  7. python3网络编程之socketserver

    本节主要是讲解python3网络编程之socketserver,在上一节中我们讲到了socket.由于socket无法支持多用户和多并发,于是就有了socket server. socket serv ...

  8. 高并发网络编程之epoll详解(转载)

    高并发网络编程之epoll详解(转载) 转载自:https://blog.csdn.net/shenya1314/article/details/73691088 在linux 没有实现epoll事件 ...

  9. 网络编程之C10K

    网络编程之C10K 虽然在过去的十几年里C10K问题已经可以很好的解决,但学习网络编程时研究C10K问题仍然价值巨大,因为技术的发展都是有规律和线索可循的,了解C10K问题及其解决思路,通过举一反三, ...

随机推荐

  1. 删除word文档中表格后的空行

    处理办法为: 方法1:使上.下页边距数值缩小,从而使页面扩大能容纳下这一段落行.   方法2:光标处于最后段落行符号前,右键→段落→缩进和间距→间距→行距→固定值→设置值→1磅→确定.

  2. linux 命令grep

    linux 命令grep grep命令用来搜索文本,或从给定的文件中搜索行内包含了给定字符串或单词的文件.通常来说,grep显示匹配的行.使用grep来搜索包括一个或多个正则表达式匹配到的文本行,然后 ...

  3. 一个简单的脚本让你的ubuntu14.04记忆屏幕亮度

    小弟献丑,发个没技术含量的.本人电脑是联想y400,无论是安装32位的ubuntu还是64位的ubuntu,无论是13.04还是现在的 14.04开发者版本,都无法让我的小y实现记忆屏幕亮度这个简单的 ...

  4. Interview-Harry Potter walk through matrix.

    假设你是harry potter,在grid的左上角,你现在要走到右下角,grid中有正数也有负数,遇到正数表示你的strength增加那么多,遇到负数表示strength减少那么多,在任何时刻如果你 ...

  5. oracle 删除用户,表空间;循环删除表

    select * from dba_tablespaces 说明:查看所有表空间 ----------------------------------------------------------- ...

  6. UML: CIM & PIM

    CIM-1:定义业务流程 定义及分析业务流程(Business Process)是为了尽快理清系统范围,以便估算开发成本及时间,可不是为了要改造业务流程.系统分析员千万别误解了此步骤的目的.所以,系统 ...

  7. powerdesigner使用之——从“概念模型”到“物理模型”

    现实问题在计算机上的解决,需要我们从现实问题中抽象出实体模型,然后再将实体模型对应到数据库关系表中. 例如,我们在思考学生选课,这件事情上,实体模型就是“学生”和“课程”两个 此时,我们使用power ...

  8. Unity3d - 初学篇 Event Functions 的 继承 机制

    我们知道Start() Update() 等之类的 事件函数 在Unity 主线程中是依次调用的.至于调用的顺序可以查手册. 由此继承机制也会发生一些改变. 测试一: public class MyT ...

  9. 如何通过热修复,搞定开发中的那些 Bug?

    作为程序员,Bug 修复终究是绕不开的话题,本期移动开发精英俱乐部讨论的主题便是 Bug 修复中的 Hotfix,即热修复.接下来让我们跟随大牛的脚步来了解 Hotfix,就算你不能一下豁然开朗,相信 ...

  10. SPOJ MULTQ3 7299 Multiples of 3 (区间更新)

    题目连接:http://www.spoj.com/problems/MULTQ3/ #include <iostream> #include <stdio.h> #includ ...