Chinaunix首页 | 论坛 | 博客
  • 博客访问: 201234
  • 博文数量: 11
  • 博客积分: 4010
  • 博客等级: 上校
  • 技术积分: 160
  • 用 户 组: 普通用户
  • 注册时间: 2006-07-03 14:24
个人简介

从客服技术支持到程序开发 从传统电信行业到互联网,以及移动互联网 岁月流逝,梦想依旧 个人订阅号--licaduo

文章分类

全部博文(11)

文章存档

2010年(11)

我的朋友

分类: C/C++

2010-06-14 01:01:21

    在这里我贴一个完整的epoll封装的源代码,便于初学者使用。至于epoll的原理的理论文章在网上可以搜索出一堆。以下代码在suse 10上编译过的。
#ifndef XEPOLL_H
#define XEPOLL_H
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
//system
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
/**
* @class XEpoll
*
* @brief epoll 操作的封装
*/
class XEpoll
{
public:
 XEpoll()
 {
//创建epoll描述符
  m_Epoll = epoll_create(MAX_SOCKET_NUMBER);
  if(m_Epoll == -1)
  {
   //抛出网络异常
  }
  pthread_mutex_init(&m_Lock,NULL);
 }
 ~XEpoll()
 {
  close(m_Epoll);
  pthread_mutex_destroy(&m_Lock);   
 }
//插入一个连接
 int m_InsertLink(int nFd)
 {
  struct epoll_event  tEv;
  //事件设置成输入和边缘触发
  tEv.events = EPOLLIN | EPOLLET;
  tEv.data.fd = nFd;
  return epoll_ctl(m_Epoll, EPOLL_CTL_ADD, nFd, &tEv) ;
 }
//删除一个连接
 int m_DeleteLink(int nFd)
 {
  struct epoll_event  tEv;
  tEv.events = EPOLLIN | EPOLLET;
  tEv.data.fd = nFd;
  close(nFd);
  return epoll_ctl(m_Epoll, EPOLL_CTL_DEL, nFd, &tEv) ;
 }
 //等待接收,返回值是需要读取数据的描述符vector
 vector  m_Wait()
 {
  vector  vFd;
  struct epoll_event  tEvents[MAX_EPOEVENTS];
  int nFds = epoll_wait(m_Epoll, tEvents, MAX_EPOEVENTS,-1);
  for (int i = 0; i < nFds; ++i)
  {
   if (tEvents[i].events & EPOLLIN)
   {
    vFd.push_back(tEvents[i].data.fd);
   }
  }
  return vFd;
 }
private:
 pthread_mutex_t    m_Lock;            ///<缓存的读写锁
 int  m_Epoll;                         //epoll描述符
};

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