epoll c++封装
#ifndef _BFC_EPOLL_FLOW_HPP_
#define _BFC_EPOLL_FLOW_HPP_
#include <string.h>
#include <errno.h>
#include <sys/epoll.h>
#include <assert.h>
#include <string>
#include <stdexcept>
#include <iostream>
/*
EPOLLIN :表示对应的文件描述符可以读
EPOLLOUT:表示对应的文件描述符可以写
EPOLLPRI:表示对应的文件描述符有紧急的数据可读
EPOLLERR:表示对应的文件描述符发生错误
EPOLLHUP:表示对应的文件描述符被挂断
EPOLLET: 表示对应的文件描述符有事件发生
*/
class CEPollFlow
{
public:
CEPollFlow();
~CEPollFlow();
int Create(int iMaxFD);
//int Wait(int iTimeMs);
int Wait(int iTimeMs);
int GetEvents(long long &llKey, unsigned int &iEvent);
int Add(int iFd,long long llKey,int iFlag);
int Modify(int iFd,long long llKey,int iFlag);
int Del(int iFd);
private:
int Ctl(int iFd,long long llKey,int iEpollAction, int iFlag);
int m_iEpollFD;
epoll_event* m_pEpollEvents;
int m_iMaxFD;
int m_iEventNum;
int m_iCurrEvtIdx;
};
#endif // _BFC_EPOLL_FLOW_HPP_
#include "bfc_epoll_flow.h"
CEPollFlow::CEPollFlow()
{
m_iEpollFD = -1;
m_pEpollEvents = NULL;
}
CEPollFlow::~CEPollFlow()
{
if(m_pEpollEvents)
{
delete [] m_pEpollEvents;
}
if(m_iEpollFD >= 0)
{
close(m_iEpollFD);
}
}
int CEPollFlow::Create(int iMaxFD)
{
m_iMaxFD = iMaxFD;
m_iEpollFD = epoll_create(iMaxFD);
if(m_iEpollFD < 0)
{
return -1;
}
m_pEpollEvents = new epoll_event[iMaxFD];
return 0;
}
int CEPollFlow::Wait(int iTimeMs)
{
m_iEventNum = epoll_wait(m_iEpollFD, m_pEpollEvents, m_iMaxFD, iTimeMs);
m_iCurrEvtIdx = 0;
return m_iEventNum;
}
int CEPollFlow::Add(int iFd, long long llKey, int iFlag)
{
return Ctl(iFd,llKey,EPOLL_CTL_ADD,iFlag);
}
int CEPollFlow::Del(int iFd)
{
return Ctl(iFd, 0, EPOLL_CTL_DEL, 0);
}
int CEPollFlow::Modify(int iFd, long long llKey, int iFlag)
{
return Ctl(iFd, llKey, EPOLL_CTL_MOD, iFlag);
}
int CEPollFlow::GetEvents(long long &llKey, unsigned int &iEvent)
{
if(m_iCurrEvtIdx >= m_iEventNum)
{
return 0;
}
epoll_event* curr_event = &m_pEpollEvents[m_iCurrEvtIdx++];
llKey = curr_event->data.u64;
iEvent = curr_event->events;
return 1;
}
int CEPollFlow::Ctl(int iFd,long long llKey,int iEpollAction, int iFlag)
{
epoll_event evt;
evt.events = iFlag;
evt.data.u64 = llKey;
int ret = epoll_ctl(m_iEpollFD, iEpollAction, iFd, &evt);
if(ret < 0)
{
return -1;
}
return 0;
}
epoll c++封装的更多相关文章
- libevent源码阅读笔记(一):libevent对epoll的封装
title: libevent源码阅读笔记(一):libevent对epoll的封装 最近开始阅读网络库libevent的源码,阅读源码之前,大致看了张亮写的几篇博文(libevent源码深度剖析 h ...
- muduo定时器、多线程模型及epoll的封装
timerfd是Linux为用户程序提供的一个定时器接口,这个接口基于文件描述符. clock_gettime函数可以获取系统时钟,精确到纳秒.需要在编译时指定库:-lrt.可以获取两种类型时间: C ...
- 基于epoll的聊天室程序
epoll相对于poll和select这两个多路复用的I/O模型更加的高效.epoll的函数很简单,麻烦的地方在于水平触发和边沿触发. 用张图来说明下 ET(边沿)只是在状态反转时触发,比如从不可读到 ...
- 04: 事件驱动、五种I/O操作、I/O多路复用select和epoll
网络编程其他篇 目录: 1.1 事件驱动 1.2 五种I/O操作 1.3 I/O 多路复用之select.poll.epoll详解 1.1 事件驱动返回顶部 1.什么是事件驱动 定义:就是根据不同事 ...
- c++ 网络编程(八) LINUX-epoll/windows-IOCP下 socket opoll函数用法 优于select方法的epoll 以及windows下IOCP 解决多进程服务端创建进程资源浪费问题
原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/9622548.html 锲子:关于并发服务器中的I/O复用实现方式,前面在网络编程系列四还是五来 ...
- 第二章epoll
epoll_create:函数实现分析 /* * Open an eventpoll file descriptor. */ SYSCALL_DEFINE1(epoll_create1, int, f ...
- epoll源码解析翻译------说使用了mmap的都是骗子
本文地址 //https://www.cnblogs.com/l2017/p/10830391.html //https://blog.csdn.net/li_haoren select poll e ...
- Tornado框架简析
Tornado是一款轻量级的Web服务器,同时又是一个开发框架.采用单线程非阻塞I/O模型(epoll),主要是为了应对高并发 访问量而被开发出来,尤其适用于comet应用. Tornado服务器3大 ...
- 【转】libevent源码分析
libevent源码分析 转自:http://www.cnblogs.com/hustcat/archive/2010/08/31/1814022.html 这两天没事,看了一下Memcached和l ...
随机推荐
- JavaScript 上万条数据 导出Excel文件(改装版)
最近项目要js实现将数据导出excel文件,网上很多插件实现~~那个开心呀,谁知道后面数据量达到上万条时出问题:浏览器不仅卡死,导出的excel文件一直提示网络失败.... debug调试发现var ...
- AMR文件结构
转自:http://blog.csdn.net/dinggo/article/details/1966444 https://blog.csdn.net/wlsfling/article/detail ...
- Java文档注释导出帮助文档和项目的jar包导入和导出。
1.1 文档注释导出帮助文档 在eclipse使用时,可以配合文档注释,导出对类的说明文档,从而供其他人阅读学习与使用. 通过使用文档注释,将类或者方法进行注释用@简单标注基本信息.如@au ...
- python xlrd使用
python xlrd使用 1● xlrd安装 管理员模式 success 2● 引用 import xlrd
- Oracle中如何添加和修改包含日期的数据
平时我们在sql sverver中我们添加包含日期的数据时,是直接将日期变成日期格式字符串,但是在Oracle中就不行了, 那么,如何添加包含日期数据 如:在oracle执行insert语句 /** ...
- error TS2304: Cannot find name 'Promise' && TS2307: Cannot find module '**'
error TS2304: Cannot find name 'Promise' 解决方法:在编译选项中加入"target":"es6" { "ver ...
- shlve 模块
shlve 模块 也用于序列化 它与pickle 不同之处在于 不需要惯性文件模式什么的 直接把它当成一个字典来看待 它可以直接对数据进行修改 而不用覆盖原来的数据 而pickle 你想要修改只能 ...
- 百度GIS API使用
按照惯例,先来一段"Hello World"级别的直观的效果 实现效果: 实现代码: (WEB工程下直接运行即可) <!DOCTYPE html> <html&g ...
- 源码学习:一个express().get方法的加载与调用
刚刚接触express,它的中间件确实把我搞得头晕.get的回调中要不要加next?不加载还会执行下一个中间件么?给get指定'/'路径是不是所有以'/'开头的访问在没有确切匹配时都能执行?use件又 ...
- 7.2 C++模板类实例化
参考:http://www.weixueyuan.net/view/6399.html 总结: array < int >表明用int类型来代替模板类中的类参数“T”,编译器会将模板类ar ...