热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Linuxepoll实现封装

头文件duye_epoll.h**************************************************************************

头文件duye_epoll.h

/***********************************************************************************
**
* @copyright (c) 2010-2019, Technology Co., LTD. All Right Reserved.
*
************************************************************************************/

/**
* @file duye_epoll.h
* @version
* @brief
* @author
* @date 2013-03-29
* @note
*
* 1. 2013-03-29 Created this file
*/
#pragma once#include
#include
#include
#include
#include namespace duye {class EpollEvent {
public:EpollEvent() : m_fd(-1), m_event(0){}EpollEvent(const int32 fd, const uint32 event) : m_fd(fd), m_event(event) {}~EpollEvent() {}/*** @brief get/set fd* @return fd*/int32 fd() const { return m_fd; }/*** @brief get/set events* @return events*/uint32 event() const { return m_event; }/*** @brief is received data, for network event* @return true/false*/bool isRecv() { return m_event & EPOLLIN; }bool isRecv() const { return m_event & EPOLLIN; }/*** @brief is sent data, for network event* @return true/false*/bool isSend() { return m_event & EPOLLOUT; }bool isSend() const { return m_event & EPOLLOUT; }/*** @brief is sent data, for network event* @return true/false*/ bool isClosed() { return (m_event & EPOLLERR) || (m_event & EPOLLHUP); }bool isClosed() const { return (m_event & EPOLLERR) || (m_event & EPOLLHUP); }/*** @brief is disconnection, for network event* @return true/false*/bool isDiscon() { return (m_event == EPOLLERR || m_event == EPOLLHUP) ? true : false; }private:int32 m_fd; uint32 m_event;
};/*** @brief epoll socket server*/
class Epoll {
public:typedef struct epoll_event SysEvent;typedef std::list EventList;public:Epoll();~Epoll();/*** @brief open epoll* @param [in] maxEvent : the number of the max events* @return true/false*/bool open(const uint32 maxEvents = 1024);/*** @brief close epoll* @return true/false*/bool close(); /*** @brief add fd* @param [in] fd : fd* @param [in] epollMode : epoll events(EPOLLIN, EPOLLOUT, EPOLLPRI, EPOLLERR, * EPOLLHUP, EPOLLET, EPOLLONESHOT), default is EPOLLIN | EPOLLOUT* @return true/false*/ bool addfd(const int32 fd, const uint32 epollMode = EPOLLIN | EPOLLOUT);/*** @brief modify fd* @param [in] fd : fd* @param [in] epollMode : epoll events(EPOLLIN, EPOLLOUT, EPOLLPRI, EPOLLERR, * EPOLLHUP, EPOLLET, EPOLLONESHOT), default is EPOLLIN | EPOLLOUT* @return true/false*/ bool modfd(const int32 fd, const uint32 epollMode = EPOLLIN | EPOLLOUT);/*** @brief delete fd* @param [in] fd : fd* @return true/false*/bool delfd(const int32 fd);/*** @brief wait event* @param [out] eventList : return event* @param [in] timeout : wait time out, default is -1, indicate block, millisecond* @return true/false*/bool wait(Epoll::EventList& eventList, const uint32 timeout = -1);/*** @brief get last error string* @return error string* @note */ uint8* error(); private:// create epollbool create();private:int32 m_epollfd; uint32 m_maxEvents;SysEvent* m_sysEvents;Error m_error;
};}

cpp文件duye_epoll.h

/************************************************************************************
**
* @copyright (c) 2013-2100, Technology Co., LTD. All Right Reserved.
*
*************************************************************************************/

/**
* @file duye_epoll.cpp
* @version
* @brief
* @author
* @date 2013-03-29
* @note
*
* 1. 2013-03-29 Created this file
*/
#include
#include <string.h>
#include
#include
#include namespace duye {static const int8* DUYE_LOG_PREFIX &#61; "duye.system.epoll";Epoll::Epoll() : m_epollfd(-1), m_maxEvents(0), m_sysEvents(NULL) {m_error.setPrefix(DUYE_LOG_PREFIX);
}Epoll::~Epoll() {close();
}bool Epoll::open(const uint32 maxEvents) {close();m_maxEvents &#61; maxEvents;m_epollfd &#61; epoll_create(m_maxEvents);if (m_epollfd &#61;&#61; -1) {ERROR_DUYE_LOG("%s:%d > epoll_create failed \n", __FILE__, __LINE__);return false;} m_sysEvents &#61; (struct epoll_event*)calloc(m_maxEvents, sizeof(struct epoll_event));if (m_sysEvents &#61;&#61; NULL) {ERROR_DUYE_LOG("%s:%d > calloc return NULL \n", __FILE__, __LINE__);return false;}return true;
}bool Epoll::close() {m_maxEvents &#61; 0;if (m_epollfd !&#61; -1) {::close(m_epollfd);m_epollfd &#61; -1;}if (m_sysEvents !&#61; NULL) {free(m_sysEvents);m_sysEvents &#61; NULL;} return true;
}bool Epoll::addfd(const int32 fd, const uint32 epollMode) {if (m_epollfd &#61;&#61; -1) {ERROR_DUYE_LOG("%s:%d > m_epollfd &#61;&#61; -1", __FILE__, __LINE__);return false;}struct epoll_event epollEvent;bzero(&epollEvent, sizeof(struct epoll_event));epollEvent.data.fd &#61; fd;epollEvent.events &#61; epollMode;int32 ret &#61; epoll_ctl(m_epollfd, EPOLL_CTL_ADD, fd, &epollEvent);if (ret !&#61; 0) {ERROR_DUYE_LOG("[%s:%d] epoll_ctl() return &#61; %d", __FILE__, __LINE__, ret);return false;}return true;
}bool Epoll::modfd(const int32 fd, const uint32 epollMode) {if (m_epollfd &#61;&#61; -1) {ERROR_DUYE_LOG("[%s:%d] m_epollfd &#61;&#61; -1", __FILE__, __LINE__);return false;}struct epoll_event epollEvent;bzero(&epollEvent, sizeof(struct epoll_event));epollEvent.data.fd &#61; fd;epollEvent.events &#61; epollMode;return epoll_ctl(m_epollfd, EPOLL_CTL_MOD, fd, &epollEvent) &#61;&#61; 0 ? true : false;
}bool Epoll::delfd(const int32 fd) {if (m_epollfd &#61;&#61; -1) {ERROR_DUYE_LOG("[%s:%d] m_epollfd &#61;&#61; -1", __FILE__, __LINE__);return false;}return epoll_ctl(m_epollfd, EPOLL_CTL_DEL, fd, NULL) &#61;&#61; 0 ? true : false;
}bool Epoll::wait(Epoll::EventList& eventList, const uint32 timeout) {if (m_epollfd &#61;&#61; -1) {ERROR_DUYE_LOG("[%s:%d] m_epollfd &#61;&#61; -1", __FILE__, __LINE__);return false;}int32 event_count &#61; epoll_wait(m_epollfd, m_sysEvents, m_maxEvents, timeout);if (event_count <&#61; 0) {return false;}for (uint32 i &#61; 0; i <(uint32)event_count; i&#43;&#43;) {eventList.push_back(EpollEvent(m_sysEvents[i].data.fd, m_sysEvents[i].events));// if ((m_sysEvents[i].events & EPOLLERR) || // (m_sysEvents[i].events & EPOLLHUP)) {// ERROR_DUYE_LOG("[%s:%d] epoll error, close fd \n", __FILE__, __LINE__);// delfd(m_sysEvents[i].data.fd);// eventList.push_back(EpollEvent(m_sysEvents[i].data.fd, ERROR_FD));// continue;// } else if (m_sysEvents[i].events & EPOLLIN) {// eventList.push_back(EpollEvent(m_sysEvents[i].data.fd, RECV_FD));// } else if (m_sysEvents[i].events & EPOLLOUT) {// eventList.push_back(EpollEvent(m_sysEvents[i].data.fd, SEND_FD));// } else {// eventList.push_back(EpollEvent(m_sysEvents[i].data.fd, m_sysEvents[i].events));// }}return true;
}uint8* Epoll::error() {return m_error.error;
}}


推荐阅读
  • 本文介绍了如何在Ubuntu 16.04系统上配置Nginx服务器,以便能够通过网络访问存储在服务器上的图片资源。这解决了在网页开发中需要使用自定义在线图标的需求。 ... [详细]
  • 本文详细解析了muduo库中的Socket封装及字节序转换功能。主要涉及`Endian.h`和`SocketsOps.h`两个头文件,以及`Socket.h`和`InetAddress.h`类的实现。 ... [详细]
  • GNU GRUB(简称GRUB)是一个来自GNU项目的支持多启动的引导加载程序。它允许用户在同一台计算机上安装多个操作系统,并在启动时选择希望启动的系统。 ... [详细]
  • 本文探讨了在支付项目开发中使用SS5 Socket Server实现内部网络访问外部网络的技术方案。详细介绍了SS5的安装、配置及性能测试过程,旨在为面临相同需求的技术人员提供参考。 ... [详细]
  • Java面向对象编程深入解析
    本文详细探讨了Java中的关键字static、单例模式、main()方法、代码块、final关键字、抽象类与方法、模板方法设计模式、接口、内部类等内容,旨在帮助读者深入理解和掌握Java面向对象编程的核心概念。 ... [详细]
  • 目录介绍01.CoordinatorLayout滑动抖动问题描述02.滑动抖动问题分析03.自定义AppBarLayout.Behavior说明04.CoordinatorLayo ... [详细]
  • 本文详细介绍了如何在Ubuntu系统上快速安装和配置Bitnami版本的GitLab,包括下载安装文件、执行安装过程以及设置邮件服务等步骤。 ... [详细]
  • 本文主要探讨了在实现Socket通信时,服务器端可能出现的端口冲突问题及其解决方案。通过具体示例和步骤指导,帮助读者理解和解决此类常见问题。 ... [详细]
  • 本文探讨了在使用阿里云RDS实例时遇到的一个时区问题。该问题导致系统时间与预期时间相差13小时。通过深入分析,发现问题是由于名为CST的时区存在多种解释,特别是在MySQL和Java之间进行时区协商时出现的误解。 ... [详细]
  • 导入大csv文件到mysql(CSV导入) ... [详细]
  • 本文档详细介绍了2017年8月31日关于MySQL数据库备份与恢复的教学内容,包括MySQL日志功能、备份策略、备份工具及实战演练。 ... [详细]
  • 本文介绍了ADB(Android Debug Bridge)的基本概念、安装方法、环境配置、连接真机步骤以及常用命令和高级技巧。ADB是一个强大的工具,适用于Android设备的开发和调试。 ... [详细]
  • Zookeeper面试常见问题解析
    本文详细介绍了Zookeeper中的ZAB协议、节点类型、ACL权限控制机制、角色分工、工作状态、Watch机制、常用客户端、分布式锁实现、默认通信框架以及消息广播和领导选举的流程。 ... [详细]
  • 本文详细介绍了如何通过修改Lua源码或使用动态链接库(DLL)的方式实现Lua与C++之间的高级交互,包括如何编译Lua源码、添加自定义API以及在C++中加载和调用Lua脚本。 ... [详细]
  • 针对上一期关于 Windows 8 的问题,我们正在积极解决。本文提供 IE6,7,8 三个版本的单文件版下载,适用于 Windows Vista/7 系统,支持 x86 和 x64 架构。欢迎大家下载并分享。 ... [详细]
author-avatar
87年的第一场雪
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有