epoll模型是linux实现高并发的一种方法,基于事件驱动模型,相比于select/poll 模型具有更高的效率,本人对epoll模型做了一个简易的封装,更多的功能还在完善中,在这里仅做学习参考用。
在epoll编程中,有三个非常重要的函数:
1. int epoll_create(int size) :创建epoll 句柄, 入参是表示监听的数目是多大。
2. int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event) : 事件注册函数, @param1:epoll句柄,epoli_create()的返回值, @param2: 表示注册的行为, 有ADD事件 、MOD事件、DEL事件, @param3: 注册的fd,在网络编程中,一般为sockfd,@param4:表示事件类型,
3. int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout) 等待事件的产生,类似于select() 调用。
在线程池上,之前的博文写过一篇关于线程池的实现,拿来即用即可。造轮子的过程虽然很枯燥也很痛苦,但当你做一个项目用到你造的轮子时还是很有成就感的(菜鸟的成就感~)。
封装的比较简单,后续会完善。
#ifndef _CEVENT_H_
#define _CEVENT_H_
#include <sys/socket.h>
#include <sys/types.h>
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/wait.h>
#include <sys/epoll.h>
#define MAX_SIZE 1024
enum EventType
{
EIN = EPOLLIN, // 读事件
EOUT = EPOLLOUT, // 写事件
ECLOSE = EPOLLRDHUP, // 对端关闭连接或者写半部
EPRI = EPOLLPRI, // 紧急数据到达
EERR = EPOLLERR, // 错误事件
EET = EPOLLET, // 边缘触发
EDEFULT = EIN | ECLOSE | EERR | EET
};
class CEvent
{
public:
CEvent();
~CEvent();
int Register_event(int fd, EventType type = EDEFULT);
int unRegister_event(int fd);
void* EventHandle(void* arg);
void SetNoblocking(int v_sockfd);
private:
int epfd;
bool is_running;
pthread_