转自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 等待指定数目的秒数。

  1. #include <sys/socket.h>
  2. #include <netinet/in.h>
  3. #include <stdio.h>
  4. #include <error.h>
  5. #include <errno.h>
  6. #include <unistd.h>
  7. #include <string.h>
  8. #include <stdlib.h>
  9. #include <sys/wait.h>
  10. #include <limits.h>
  11. #include <poll.h>
  12. #include <sys/stropts.h>
  13. #include <signal.h>
  14. #define MAXLINE 5
  15. #define OPEN_MAX 1024
  16. #define SA struct sockaddr
  17.  
  18. int main()
  19. {
  20. int listenfd, connfd, sockfd, i, maxi;
  21. int nready;
  22. socklen_t clilen;
  23. ssize_t n;
  24. char buf[MAXLINE];
  25. struct pollfd client[OPEN_MAX];
  26. struct sockaddr_in servaddr, cliaddr;
  27. //创建监听套接字
  28. if((listenfd = socket(AF_INET, SOCK_STREAM, )) < )
  29. {
  30. printf("socket() error!");
  31. exit();
  32. }
  33. //先要对协议地址进行清零
  34. bzero(&servaddr,sizeof(servaddr));
  35. //设置为 IPv4 or IPv6
  36. servaddr.sin_family = AF_INET;
  37. //绑定本地端口号
  38. servaddr.sin_port = htons();
  39. //任何一个 IP 地址,让内核自行选择
  40. servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
  41. //绑定套接口到本地协议地址
  42. if(bind(listenfd, (SA *) &servaddr,sizeof(servaddr)) < )
  43. {
  44. printf("bind() error!");
  45. exit();
  46. }
  47. //服务器开始监听
  48. if(listen(listenfd,) < )
  49. {
  50. printf("listen() error!");
  51. exit();
  52. }
  53. client[].fd = listenfd;
  54. client[].events = POLLRDNORM;//关心监听套机字的读事件
  55. for(i = ; i < OPEN_MAX; ++i)
  56. {
  57. client[i].fd = -;
  58. }
  59. maxi = ;
  60. for(;;)
  61. {
  62. nready = poll(client, maxi + , -);
  63. if(client[].revents & POLLRDNORM)
  64. {
  65. clilen = sizeof(cliaddr);
  66. //accept 的后面两个参数都是值-结果参数,他们的保留的远程连接电脑的信息,如果不管新远程连接电脑的信息,可以将这两个参数设置为 NULL
  67. connfd = accept(listenfd, (SA *) &cliaddr, &clilen);
  68. if(connfd < )
  69. {
  70. continue;
  71. }
  72. for(i = ; i < OPEN_MAX; ++i)
  73. {
  74. if(client[i].fd < )
  75. client[i].fd = connfd;
  76. break;
  77. }
  78. if(i == OPEN_MAX)
  79. {
  80. printf("too many clients");
  81. exit();
  82. }
  83. client[i].events = POLLRDNORM;
  84. if(i > maxi)
  85. {
  86. maxi = i;
  87. }
  88. if(--nready <= )
  89. continue;
  90. }
  91. for(i = ; i < OPEN_MAX; ++i)
  92. {
  93. if((sockfd = client[i].fd) < )
  94. {
  95. continue;
  96. }
  97. if(client[i].revents & POLLRDNORM | POLLERR)
  98. {
  99. if((n = read(sockfd, buf, MAXLINE)) < )
  100. {
  101. if(errno == ECONNRESET)
  102. {
  103. close(sockfd);
  104. client[i].fd = -;
  105. }
  106. else
  107. {
  108. printf("read error!\n");
  109. }
  110. }
  111. else if(n == )
  112. {
  113. close(sockfd);
  114. client[i].fd = -;
  115. }
  116. else
  117. {
  118. write(sockfd, buf, n);
  119. }
  120. if(--nready <= )
  121. break;
  122. }
  123. }
  124. }
  125. }

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. cocos3.2中如何创建一个场景

    1.可以将一些比较通用的东西放到Common.h中,这是一个.h文件,必须手动添加,且保证在classes目录里 #ifndef __COMMON_H__ #define __COMMON_H__ # ...

  2. java synchronized(一)

    java synchronized主要用于控制线程同步,中间有很多小的细节,知识,这里我简单的整理一下,做个记录.主要用于方法和代码块的控制 先说说方法控制 模拟银行存款和取款,创建一个Account ...

  3. startDiscovery() and startLeScan().

    You have to start a scan for Classic Bluetooth devices with startDiscovery() and a scan for Bluetoot ...

  4. 20145120 《Java程序设计》第5周学习总结

    20145120 <Java程序设计>第5周学习总结 教材学习内容总结 try和catch语法,如果被try{}的语句出现了catch()的问题就执行catch{}的语句. 错误的对象都继 ...

  5. javascript积累

    本来是java程序员,但是工作过程中总是遇到各种js的任务得完成,所以也得慢慢积累啊! 一.浏览器对象模型(Browser Object Model)BOM     window对象:当前浏览器窗口 ...

  6. LA 4384

    扩展欧几里得 #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> ...

  7. 关于StringBuilder

    写在前面的话 很久没有更新博客了,来上海实习身边的一切波动挺大的,还好我走过来了,博客园:一路有你! StringBuilder 相信大家对StringBuilder类型一定不陌生,我们Coding经 ...

  8. PHPer 为什么会被 Javaer 鄙视?

    最近看了知乎上的一个话题 「在工作中,为什么 Java 程序员常常瞧不起 PHP 程序员?」 个人从业多年,用过的后端语言 ASP.ASP.NET.Java.PHP.Node.js.Python,如果 ...

  9. hdu 4324 Triangle LOVE(拓扑排序,基础)

    题目 /***************************参考自****************************/ http://www.cnblogs.com/newpanderking ...

  10. POJ 1666

    #include<iostream> using namespace std; int main() { int num_stu; int i; ; do{ time=; cin>& ...