Chinaunix首页 | 论坛 | 博客
  • 博客访问: 291705
  • 博文数量: 134
  • 博客积分: 667
  • 博客等级: 上士
  • 技术积分: 770
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-08 15:19
文章分类

全部博文(134)

文章存档

2012年(134)

分类:

2012-04-08 16:05:23

原文地址:epoll实例 作者:yulianliu1218

epoll实例 
  1. #include   
  2. #include   
  3. #include   
  4. #include   
  5. #include   
  6. #include   
  7. #include   
  8. #include   
  9. #include   
  10. using namespace std;  
  11. #define MAX_EVENTS 500  
  12. struct myevent_s  
  13. {  
  14.     int fd;  
  15.     void (*call_back)(int fd, int events, void *arg);  
  16.     int events;  
  17.     void *arg;  
  18.     int status; // 1: in epoll wait list, 0 not in  
  19.     char buff[128]; // recv data buffer  
  20.     int len;  
  21.     long last_active; // last active time  
  22. };  
  23. // set event  
  24. void EventSet(myevent_s *ev, int fd, void (*call_back)(intintvoid*), void *arg)  
  25. {  
  26.     ev->fd = fd;  
  27.     ev->call_back = call_back;  
  28.     ev->events = 0;  
  29.     ev->arg = arg;  
  30.     ev->status = 0;  
  31.     ev->last_active = time(NULL);  
  32. }  
  33. // add/mod an event to epoll  
  34. void EventAdd(int epollFd, int events, myevent_s *ev)  
  35. {  
  36.     struct epoll_event epv = {0, {0}};  
  37.     int op;  
  38.     epv.data.ptr = ev;  
  39.     epv.events = ev->events = events;  
  40.     if(ev->status == 1){  
  41.         op = EPOLL_CTL_MOD;  
  42.     }  
  43.     else{  
  44.         op = EPOLL_CTL_ADD;  
  45.         ev->status = 1;  
  46.     }  
  47.     if(epoll_ctl(epollFd, op, ev->fd, &epv) < 0)  
  48.         printf("Event Add failed[fd=%d]/n", ev->fd);  
  49.     else  
  50.         printf("Event Add OK[fd=%d]/n", ev->fd);  
  51. }  
  52. // delete an event from epoll  
  53. void EventDel(int epollFd, myevent_s *ev)  
  54. {  
  55.     struct epoll_event epv = {0, {0}};  
  56.     if(ev->status != 1) return;  
  57.     epv.data.ptr = ev;  
  58.     ev->status = 0;  
  59.     epoll_ctl(epollFd, EPOLL_CTL_DEL, ev->fd, &epv);  
  60. }  
  61. int g_epollFd;  
  62. myevent_s g_Events[MAX_EVENTS+1]; // g_Events[MAX_EVENTS] is used by listen fd  
  63. void RecvData(int fd, int events, void *arg);  
  64. void SendData(int fd, int events, void *arg);  
  65. // accept new connections from clients  
  66. void AcceptConn(int fd, int events, void *arg)  
  67. {  
  68.     struct sockaddr_in sin;  
  69.     socklen_t len = sizeof(struct sockaddr_in);  
  70.     int nfd, i;  
  71.     // accept  
  72.     if((nfd = accept(fd, (struct sockaddr*)&sin, &len)) == -1)  
  73.     {  
  74.         if(errno != EAGAIN && errno != EINTR)  
  75.         {  
  76.             printf("%s: bad accept", __func__);  
  77.         }  
  78.         return;  
  79.     }  
  80.     do  
  81.     {  
  82.         for(i = 0; i < MAX_EVENTS; i++)  
  83.         {  
  84.             if(g_Events[i].status == 0)  
  85.             {  
  86.                 break;  
  87.             }  
  88.         }  
  89.         if(i == MAX_EVENTS)  
  90.         {  
  91.             printf("%s:max connection limit[%d].", __func__, MAX_EVENTS);  
  92.             break;  
  93.         }  
  94.         // set nonblocking  
  95.         if(fcntl(nfd, F_SETFL, O_NONBLOCK) < 0) break;  
  96.         // add a read event for receive data  
  97.         EventSet(&g_Events[i], nfd, RecvData, &g_Events[i]);  
  98.         EventAdd(g_epollFd, EPOLLIN|EPOLLET, &g_Events[i]);  
  99.         printf("new conn[%s:%d][time:%d]/n", inet_ntoa(sin.sin_addr), ntohs(sin.sin_port), g_Events[i].last_active);  
  100.     }while(0);  
  101. }  
  102. // receive data  
阅读(621) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~