Chinaunix首页 | 论坛 | 博客
  • 博客访问: 135196
  • 博文数量: 25
  • 博客积分: 588
  • 博客等级: 中士
  • 技术积分: 292
  • 用 户 组: 普通用户
  • 注册时间: 2011-01-10 18:18
文章分类

全部博文(25)

文章存档

2012年(7)

2011年(18)

我的朋友

分类: LINUX

2012-03-21 14:56:18

myevent.h

点击(此处)折叠或打开

  1. #ifndef __MY_EVENTS_H__
  2. #define __MY_EVENTS_H__

  3. #include <sys/epoll.h>

  4. #define EV_READ 0x01
  5. #define EV_WRITE 0x02
  6. #define EV_PERSIST 0x04
  7. #define EV_ET 0x08


  8. typedef int (*_handle_callback)(int fd, int evop);

  9. struct event_t {
  10.     _handle_callback callback;
  11.     struct epoll_event *events;
  12.     int nevents;
  13.     int epfd;
  14. };

  15. event_t* event_init (_handle_callback callback, int size = 10240); 
  16. int event_destroy(event_t* handle);
  17. int event_add (event_t* handle, int fd, int op);
  18. int event_del (event_t* handle, int fd);
  19. int event_modify (event_t* handle, int fd, int op);
  20. int event_dispatch (event_t *handle, int timeout = -1);

  21. #endif //_MY_EVENTS_H__

myevent.cpp


点击(此处)折叠或打开

  1. #include "myevent.h"
  2. #include <stdlib.h>
  3. #include <unistd.h>

  4. #ifndef EPOLLRDHUP
  5. #define USE_OWN_RDHUP
  6. #define EPOLLRDHUP 0x2000
  7. #endif

  8. event_t* event_init (_handle_callback callback, int size)
  9. {
  10.     struct event_t* handle;
  11.     int epfd = epoll_create (32000);
  12.     if (epfd < 0) {
  13.         return NULL;
  14.     }
  15.     handle = (struct event_t*)malloc (sizeof (struct event_t));
  16.     if (!handle) {
  17.         return NULL;
  18.     }
  19.     handle->epfd = epfd;
  20.     handle->nevents = size;
  21.     handle->callback = callback;
  22.     handle->events = (struct epoll_event*) malloc (sizeof (epoll_event) * size); 
  23.     if (!handle->events) {
  24.         free (handle);
  25.         return NULL;
  26.     }
  27.     return handle;
  28. }

  29. int event_destroy (event_t *handle)
  30. {
  31.     if (handle) {
  32.         if (handle->epfd > 0) {
  33.             close (handle->epfd);
  34.         }
  35.         if (handle->events) {
  36.             free (handle->events);
  37.         }
  38.         free (handle);
  39.     }
  40.     return 0;
  41. }

  42. int event_add (event_t* handle, int fd, int op)
  43. {
  44.     struct epoll_event ev;
  45.     ev.data.fd = fd;
  46.     ev.events = EPOLLERR | EPOLLHUP | EPOLLRDHUP;
  47.     if (op & EV_WRITE) {
  48.         ev.events |= EPOLLOUT;
  49.     }
  50.     if (op & EV_READ) {
  51.         ev.events |= EPOLLIN;
  52.     }
  53.     if (op & EV_ET) {
  54.         ev.events |= EPOLLET;
  55.     }
  56.     if (epoll_ctl (handle->epfd, EPOLL_CTL_ADD, fd, &ev) < 0) {
  57.         return -1;
  58.     }
  59.     return 0;
  60. }

  61. int event_del (event_t* handle, int fd)
  62. {
  63.     struct epoll_event ev;
  64.     ev.data.fd = fd;
  65.     if (epoll_ctl (handle->epfd, EPOLL_CTL_DEL, fd, &ev) < 0) {
  66.         return -1;
  67.     }
  68.     return 0;
  69. }

  70. int event_modify (event_t* handle, int fd, int op)
  71. {
  72.     struct epoll_event ev;
  73.     ev.data.fd = fd; 
  74.     ev.events = EPOLLERR | EPOLLHUP | EPOLLRDHUP;
  75.     if (op & EV_WRITE) {
  76.         ev.events |= EPOLLOUT;
  77.     }
  78.     if (op & EV_READ) {
  79.         ev.events |= EPOLLIN; 
  80.     }
  81.     if (op & EV_ET) {
  82.         ev.events |= EPOLLET;
  83.     }
  84.     if (epoll_ctl (handle->epfd, EPOLL_CTL_MOD, fd, &ev) < 0) {
  85.         return -1;
  86.     }
  87.     return 0;
  88. }

  89. int event_dispatch (event_t *handle, int timeout) {
  90.     struct epoll_event *events = handle->events;
  91.     //for (;;) {
  92.         int res = epoll_wait (handle->epfd, events, handle->nevents, timeout);
  93.         for (int i = 0; i < res; i++) {
  94.             int op = 0;
  95.             if (events[i].events & (EPOLLERR|EPOLLHUP|EPOLLRDHUP) ) {
  96.                 op |= EV_READ | EV_WRITE;
  97.             }
  98.             else {
  99.                 if (events[i].events & EPOLLIN) {
  100.                     op |= EV_READ;
  101.                 }
  102.                 if (events[i].events & EPOLLOUT) {
  103.                     op |= EV_WRITE;
  104.                 }
  105.             }
  106.             handle->callback (events[i].data.fd, op);
  107.         }
  108.     //}
  109.     return 0;
  110. }

  111. #ifdef USE_OWN_RDHUP
  112. #undef EPOLLRDHUP
  113. #undef USE_OWN_RDHUP
  114. #endif


阅读(3627) | 评论(1) | 转发(0) |
0

上一篇:单向链表

下一篇:GIT图解

给主人留下些什么吧!~~

Charles04292014-06-09 18:58:45

您好,请问下发生EPOLLERR和EPOLLHUP时,为什么不是直接关闭连接,而是把事件设置成EPOLLIN和EPOLLOUT?