在这里我贴一个完整的epoll封装的源代码,便于初学者使用。至于epoll的原理的理论文章在网上可以搜索出一堆。以下代码在suse 10上编译过的。
#ifndef XEPOLL_H
#define XEPOLL_H
#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
阅读(3746) | 评论(0) | 转发(0) |