Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1466881
  • 博文数量: 842
  • 博客积分: 12411
  • 博客等级: 上将
  • 技术积分: 5772
  • 用 户 组: 普通用户
  • 注册时间: 2011-06-14 14:43
文章分类

全部博文(842)

文章存档

2013年(157)

2012年(685)

分类: LINUX

2012-03-06 14:31:51

poll实例
view plai
  1. #include   
  2. #include   
  3. #include   
  4. #include   
  5. #include   
  6. #include   
  7. #include   
  8. #include   
  9. #include   
  10. #include   
  11. #include   
  12. #include   
  13. #include   
  14. #include   
  15. #include   
  16. #include   
  1. #define MAXBUF 1024  
  2. #define MAXEPOLLSIZE 10000  
  1.   
  2. int setnonblocking(int sockfd)  
  3. {  
  4.     if (fcntl(sockfd, F_SETFL, fcntl(sockfd, F_GETFD, 0)|O_NONBLOCK) == -1)  
  5.  {  
  6.         return -1;  
  7.     }  
  8.     return 0;  
  9. }  
  1.   
  2. int handle_message(int new_fd)  
  3. {  
  4.     char buf[MAXBUF + 1];  
  5.     int len;  
  6.       
  7.    
  8.     bzero(buf, MAXBUF + 1);  
  9.      
  10.    
  11.     len = recv(new_fd, buf, MAXBUF, 0);  
  12.     if (len > 0)  
  13.  {  
  14.         printf  
  15.             ("%d接收消息成功:'%s',共%d个字节的数据/n",  
  16.              new_fd, buf, len);  
  17.  }  
  18.     else  
  19.  {  
  20.         if (len < 0)  
  21.      printf  
  22.                 ("消息接收失败!错误代码是%d,错误信息是'%s'/n",  
  23.                  errno, strerror(errno));  
  24.         close(new_fd);  
  25.         return -1;  
  26.     }  
  27.       
  28.     return len;  
  29. }  

  30. int main(int argc, char **argv)  
  31. {  
  32.     int listener, new_fd, kdpfd, nfds, n, ret, curfds;  
  33.     socklen_t len;  
  34.     struct sockaddr_in my_addr, their_addr;  
  35.     unsigned int myport, lisnum;  
  36.     struct epoll_event ev;  
  37.     struct epoll_event events[MAXEPOLLSIZE];  
  38.     struct rlimit rt;  
  39.  myport = 5000;  
  40.  lisnum = 2;   
  41.       
  42.    
  43.     rt.rlim_max = rt.rlim_cur = MAXEPOLLSIZE;  
  44.     if (setrlimit(RLIMIT_NOFILE, &rt) == -1)   
  45.  {  
  46.         perror("setrlimit");  
  47.         exit(1);  
  48.     }  
  49.     else   
  50.     {  
  51.         printf("设置系统资源参数成功!/n");  
  52.     }  
  1.       
  2.     if ((listener = socket(PF_INET, SOCK_STREAM, 0)) == -1)  
  3.     {  
  4.         perror("socket");  
  5.         exit(1);  
  6.     }  
  7.     else  
  8.     {  
  9.         printf("socket 创建成功!/n");  
  10.  }  
  11.    
  12.     setnonblocking(listener);  
  1.     bzero(&my_addr, sizeof(my_addr));  
  2.     my_addr.sin_family = PF_INET;  
  3.     my_addr.sin_port = htons(myport);  
  4.     my_addr.sin_addr.s_addr = INADDR_ANY;  
view plain
  1.     if (bind(listener, (struct sockaddr *) &my_addr, sizeof(struct sockaddr)) == -1)   
  2.     {  
  3.         perror("bind");  
  4.         exit(1);  
  5.     }   
  6.     else  
  7.     {  
  8.         printf("IP 地址和端口绑定成功/n");  
  9.  }  
  10.     if (listen(listener, lisnum) == -1)   
  11.     {  
  12.         perror("listen");  
  13.         exit(1);  
  14.     }  
  15.     else  
  16.     {  
  17.         printf("开启服务成功!/n");  
  18.  }  
  19.       
  20.    
  21.     kdpfd = epoll_create(MAXEPOLLSIZE);  
  22.     len = sizeof(struct sockaddr_in);  
  23.     ev.events = EPOLLIN | EPOLLET;  
  24.     ev.data.fd = listener;  
  25.     if (epoll_ctl(kdpfd, EPOLL_CTL_ADD, listener, &ev) < 0)   
  26.  {  
  27.         fprintf(stderr, "epoll set insertion error: fd=%d/n", listener);  
  28.         return -1;  
  29.     }  
  30.  else  
  31.     {  
  32.   printf("监听 socket 加入 epoll 成功!/n");  
  33.  }  
  34.     curfds = 1;  
  35.     while (1)   
  36.  {  
  37.           
  38.         nfds = epoll_wait(kdpfd, events, curfds, -1);  
  39.         if (nfds == -1)  
  40.   {  
  41.             perror("epoll_wait");  
  42.             break;  
  43.         }  
  44.           
  45.         for (n = 0; n < nfds; ++n)  
  46.   {  
  47.             if (events[n].data.fd == listener)   
  48.    {  
  49.                 new_fd = accept(listener, (struct sockaddr *) &their_addr,&len);  
  50.                 if (new_fd < 0)   
  51.     {  
  52.                     perror("accept");  
  53.                     continue;  
  54.                 }   
  55.     else  
  56.     {  
  57.      printf("有连接来自于: %d:%d, 分配的 socket 为:%d/n",  
  58.                              inet_ntoa(their_addr.sin_addr), ntohs(their_addr.sin_port), new_fd);  
  59.     }  
  60.                 setnonblocking(new_fd);  
  61.                 ev.events = EPOLLIN | EPOLLET;  
  62.                 ev.data.fd = new_fd;  
  63.                 if (epoll_ctl(kdpfd, EPOLL_CTL_ADD, new_fd, &ev) < 0)  
  64.     {  
  65.                     fprintf(stderr, "把 socket '%d' 加入 epoll 失败!%s/n",  
  66.                             new_fd, strerror(errno));  
  67.                     return -1;  
  68.                 }  
  69.                 curfds++;  
  70.             }   
  71.    else  
  72.    {  
  73.                 ret = handle_message(events[n].data.fd);  
  74.                 if (ret < 1 && errno != 11)  
  75.     {  
  76.                     epoll_ctl(kdpfd, EPOLL_CTL_DEL, events[n].data.fd,&ev);  
  77.                     curfds--;  
  78.                 }  
  79.             }  
  80.         }  
  81.     }  
  82.     close(listener);  
  83.     return 0;  
  84. }  
阅读(698) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~