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 ...
随机推荐
- install sz rz linux
1◆ ready 2◆ controller component Xshell 注册码:690313-111999-999313 Xftp 注册码:101210-450789-147200 3 ...
- 逆袭之旅DAY20.XIA.循环结构
2018-07-16 19:53:47 while循环 do do...while循环 for 循环
- Debug method
#define DEBUG(format,...) printf("Ray.he file:"__FILE__" func:%s() line:%d, print &qu ...
- css 中的grid布局基础
CSS Grid Layout为CSS引入了一个二维网格系统.网格可用于布局主要页面区域或小型用户界面元素. 网格是一组交叉的水平和垂直线 - 一组定义列,其他行.元素可以放在网格上,以行或者列为标准 ...
- 总结5条对学习Linux系统有帮助的经验心得
作为国产手机中的代表厂商,OPPO一直走在国内的前沿.不仅手机出货量在国内遥遥领先,而且在国外也抢占不少的市场份额.前段时间,OPPO在台湾地区签下田馥甄和林宥嘉担任OPPO R9s的代言人外,在东南 ...
- 调用zabbix 分组api
调用zabbix 分组api,获取分组中主机host信息,并分类保存, #!/usr/bin/env python #coding:utf8 import requests import json i ...
- Date和Timestamp区别
主要是精度问题,date没有ms,而timestamp是有ms的,所以date的精度要低于timestamp. 而且二者可以互相转换. 除此之外,没有什么不同,
- day36 数据库表操作 数据类型 完整性约束
今日内容 1.存储引擎表类型 2.数据类型 3.完整性约束 1.存储引擎表类型 指令: 1.show engines:#查看MySQL所有的引擎, 2.show variables like &quo ...
- Java 从服务器下载文件到本地(页面、后台、配置都有)
先来看实现效果: 有一个链接如下: 点击链接下载文件: 第一种方法:Servlet实现 一.HTML页面部分: 1.HTML页面中的一个链接 <a id="downloadTempl ...
- vs2013 跳过IE10
安装 VS2013要安装IE10,却安装不了..以下为跳过IE10,直接安装VS2013方法 复制以下代码,保存为bat文件 @ECHO OFF :IE10HACK REG ADD "HKL ...