epoll使用示例

来源:互联网 发布:手机能编程么 编辑:程序博客网 时间:2024/05/21 20:47
  1.     while (1)   
  2.  {  
  3.         /* 等待有事件发生 */  
  4.         nfds = epoll_wait(kdpfd, events, curfds, -1);  
  5.         if (nfds == -1)  
  6.   {  
  7.             perror("epoll_wait");  
  8.             break;  
  9.         }  
  10.         /* 处理所有事件 */  
  11.         for (n = 0; n < nfds; ++n)  
  12.   {  
  13.             if (events[n].data.fd == listener)   
  14.    {  
  15.                 new_fd = accept(listener, (struct sockaddr *) &their_addr,&len);  
  16.                 if (new_fd < 0)   
  17.     {  
  18.                     perror("accept");  
  19.                     continue;  
  20.                 }   
  21.     else  
  22.     {  
  23.      printf("有连接来自于: %d:%d, 分配的 socket 为:%d/n",  
  24.                              inet_ntoa(their_addr.sin_addr), ntohs(their_addr.sin_port), new_fd);  
  25.     }  
  26.                 setnonblocking(new_fd);  
  27.                 ev.events = EPOLLIN | EPOLLET;  
  28.                 ev.data.fd = new_fd;  
  29.                 if (epoll_ctl(kdpfd, EPOLL_CTL_ADD, new_fd, &ev) < 0)  
  30.     {  
  31.                     fprintf(stderr, "把 socket '%d' 加入 epoll 失败!%s/n",  
  32.                             new_fd, strerror(errno));  
  33.                     return -1;  
  34.                 }  
  35.                 curfds++;  
  36.             }   
  37.    else  
  38.    {  
  39.                 ret = handle_message(events[n].data.fd);  
  40.                 if (ret < 1 && errno != 11)  
  41.     {  
  42.                     epoll_ctl(kdpfd, EPOLL_CTL_DEL, events[n].data.fd,&ev);  
  43.                     curfds--;  
  44.                 }  
  45.             }  
  46.         }  
  47.     }  
  48.     close(listener);  
  49.     return 0;  


原创粉丝点击