Chinaunix首页 | 论坛 | 博客
  • 博客访问: 558904
  • 博文数量: 142
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1452
  • 用 户 组: 普通用户
  • 注册时间: 2013-09-12 16:28
文章分类

全部博文(142)

文章存档

2016年(10)

2015年(60)

2014年(72)

我的朋友

分类: C/C++

2014-10-09 14:51:33

int poll(struct pollfd *fdarray, unsigned long nfds, int timeout);
返回值:若有就绪描述符则为其数目,若超时则为0,若出错则为-1.


第一个参数是指向一个结构数组第一个元素的指针。
struct pollfd {
int fd;               /*待测试的描述符fd*/
short events;         /*fd上感兴趣的事件*/ 
short revents;        /*fd上发生的事件*/
};
测试条件由event指定,函数在相应的revents成员中返回该描述符的状态。
(每个描述符都有两个变量,从而避免了select的值--结果参数).


数组fdarray中元素的个数是由nfds参数指定,历史上这个参数定义为unsigned long,似乎过分大了。定义为无符号整数就够了。UNIX 98为该参数定义了名为nfds_t的新的数据类型。
int poll(struct pollfd *fdarray, nfds_t nfds, int timeout);
timeout参数指定poll函数返回前等待多长时间。它是一个指定应等待毫秒数的正值。
1)INFTIM 永远等待
2)0      立即返回,不阻塞进程
3)>0     等待指定数目的毫秒数。

poll函数的事件标志符值
常量 说明
POLLIN 普通或优先级带数据可读
POLLRDNORM 普通数据可读
POLLRDBAND 优先级带数据可读
POLLPRI 高优先级数据可读
POLLOUT 普通数据可写
POLLWRNORM 普通数据可写
POLLWRBAND 优先级带数据可写
POLLERR 发生错误
POLLHUP 发生挂起
POLLNVAL 描述字不是一个打开的文件


点击(此处)折叠或打开

  1. #include <unistd.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <signal.h>
  5. #include <sys/socket.h>
  6. #include <sys/types.h>
  7. #include <sys/wait.h>
  8. #include <errno.h>
  9. #include <netinet/in.h>
  10. #include <arpa/inet.h>
  11. #include <sys/wait.h>
  12. #include <strings.h>
  13. #include "readn.h"
  14. #include <poll.h>
  15. #define INFTIM -1
  16. #define OPEN_MAX 1024
  17. int main(int argc,char *argv[])
  18. {
  19.     int ret = 0;
  20.     int listen_fd;
  21.     int conn_fd;
  22.     struct sockaddr_in server_addr;
  23.     struct sockaddr_in client_addr;
  24.     socklen_t len;
  25.     struct pollfd fdarray[OPEN_MAX];
  26.     nfds_t nfds;
  27.     int i;
  28.     char recvline[MAXLINE];
  29.     int n;
  30.     int fd;

  31.     listen_fd = socket(AF_INET,SOCK_STREAM,0);

  32.     if(listen_fd < 0) {
  33.         printf("socket error\n");
  34.         return -1;
  35.     }

  36.     bzero(&server_addr,sizeof(struct sockaddr_in));

  37.     server_addr.sin_family = AF_INET;
  38.     server_addr.sin_port = htons(10000);
  39.     //server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
  40.     ret = inet_pton(AF_INET,"127.0.0.1",&server_addr.sin_addr.s_addr);
  41.     if(ret < 0) {
  42.         printf("inet_pton error\n");
  43.         close(listen_fd);
  44.         return ret;
  45.     }else if(ret == 0) {
  46.         printf("the second parameter of inet_addr is null\n");
  47.     }

  48.     if(bind(listen_fd,(struct sockaddr*)&server_addr,sizeof(struct sockaddr)) == -1) {
  49.         printf("bind error\n");
  50.         close(listen_fd);
  51.         return -1;
  52.     }


  53.     if(listen(listen_fd,1024) == -1) {
  54.         printf("listen error\n");
  55.         close(listen_fd);
  56.         return -1;
  57.     }
  58.     fdarray[0].fd = listen_fd;
  59.     fdarray[0].events = POLLRDNORM;
  60.     nfds = 1;
  61.     for(i = 1;i < OPEN_MAX;i++)
  62.         fdarray[i].fd = -1;

  63.     for(;;) {
  64.         ret = poll(fdarray,nfds,INFTIM);
  65.         if(ret < 0) {
  66.             printf("poll error, errno=%d\n",errno);
  67.         }else if (ret == 0) {
  68.             printf("poll timeout\n");
  69.         }
  70.         if(fdarray[0].revents == POLLRDNORM) {
  71.             len = sizeof(client_addr);
  72.             conn_fd = accept(listen_fd,(struct sockaddr*)&client_addr,&len);
  73.             if(conn_fd < 0) {
  74.                 printf("accept error,errno=%d\n",errno);
  75.                 if(errno == EINTR)
  76.                     continue;
  77.                 return -1;
  78.             }
  79.             
  80.             for(i = 1;i < OPEN_MAX;i++) {
  81.                 if(fdarray[i].fd == -1) {
  82.                     break;
  83.                 }
  84.             }
  85.             if(i == OPEN_MAX) {
  86.                 printf("error too many fds,exceeds OPEN_MAX\n");
  87.                 return -1;
  88.             }
  89.            
  90.             fdarray[i].fd = conn_fd;
  91.             fdarray[i].events = POLLRDNORM;
  92.             nfds++;

  93.             if(--ret <= 0)
  94.                 continue;
  95.         }
  96.         for(i = 1; i <= nfds;i++)
  97.         {
  98.             if((fd = fdarray[i].fd) < 0)
  99.                 continue;

  100.             if(fdarray[i].revents == POLLRDNORM) {
  101.                 /*TODO::handle on conn_fd*/
  102.                 if((n=read(fd,recvline,MAXLINE)) == 0) {
  103.                     close(fd);
  104.                     fd = -1;
  105.                 }else {
  106.                     writen(fd,recvline,n);
  107.                 }
  108.                 if(--ret <= 0)
  109.                     break;
  110.             }
  111.         }
  112.     }
  113.     return 0;
  114. }

阅读(830) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~