【网络库】epoll接口封装
来源:互联网 发布:阿里云解析 一定要买吗 编辑:程序博客网 时间:2024/05/01 18:24
原生epoll一共只有三个库函数接口,已经足够简洁,但具体使用上各种代码实现依旧千差万别,这里对epoll做了个简单的接口封装,以供参考,本人水平有限,不足之处欢迎指教。
代码如下:
event_epoll.h
#ifndef EVENT_EPOLL_H_#define EVENT_EPOLL_H_#include <functional>#include <sys/epoll.h>class Epoll{private: typedef std::function<void (int fd, void *ctx, int revents)> event_handler; struct fd_node { fd_node(): fd(-1), ctx(NULL), handler(NULL) {} int fd; void *ctx; event_handler handler; };public: Epoll(): epoll_fd_(-1), maxfds_(-1), fd_nodes_(NULL), epoll_events_(NULL) {}public: int Init(int maxfds); int Free(); int Register(int fd, event_handler handler, void *ctx); int Unregister(int fd); int EventAdd(int fd, int events); int EventDel(int fd); int Poll(int timeout_ms);private: int epoll_fd_; int maxfds_; fd_node **fd_nodes_; epoll_event *epoll_events_;};#endif /*EVENT_EPOLL_H_*/
#include <unistd.h>#include <string.h>#include "event_epoll.h"int Epoll::Init(int maxfds){ epoll_fd_ = epoll_create(maxfds); if (-1 == epoll_fd_) return -1; maxfds_ = maxfds; fd_nodes_ = new fd_node *[maxfds]; epoll_events_ = new epoll_event[maxfds]; return 0;}int Epoll::Free(){ close(epoll_fd_); delete epoll_events_; for (int i = 0; i < maxfds_; i++) { if (fd_nodes_[i]) delete fd_nodes_[i]; } delete []fd_nodes_; return 0;}int Epoll::Register(int fd, event_handler handler, void *ctx){ fd_node *fdn; if (fd >= maxfds_) return -1; fdn = new fd_node; fdn->handler = handler; fdn->fd = fd; fdn->ctx = ctx; fd_nodes_[fd] = fdn; return 0;}int Epoll::Unregister(int fd){ if (fd >= maxfds_) return -1; delete fd_nodes_[fd]; fd_nodes_[fd] = NULL; return 0;}int Epoll::EventAdd(int fd, int events){ fd_node *fdn; struct epoll_event ep; if (fd >= maxfds_) return -1; fdn = fd_nodes_[fd]; ep.events = events; ep.data.ptr = fdn; if (0 != epoll_ctl(epoll_fd_, EPOLL_CTL_ADD, fd, &ep)) { return -1; } return 0;}int Epoll::EventDel(int fd){ struct epoll_event ep; if (0 != epoll_ctl(epoll_fd_, EPOLL_CTL_DEL, fd, &ep)) { return -1; } return 0;}int Epoll::Poll(int timeout_ms){ int n; int events; fd_node *fdn; n = epoll_wait(epoll_fd_, epoll_events_, maxfds_, timeout_ms); for (int i = 0; i < n; i++) { events = epoll_events_[i].events; fdn = (fd_node *)epoll_events_[i].data.ptr; fdn->handler(fdn->fd, fdn->ctx, events); } return n;}
0 0
- 【网络库】epoll接口封装
- 面向接口的网络处理模型(封装select, epoll, poll)
- 好用的epoll接口封装
- 网络请求接口封装方式
- iOS开发-网络-合理封装请求接口
- iOS开发-网络-合理封装请求接口
- 【微信小程序】网络请求接口封装实例
- 封装的EPOLL 模型
- Linux Epoll简单封装
- C++ Epoll的封装
- C++ Epoll的封装
- C++封装epoll
- Linux epoll 实现封装
- 网络库封装
- 自己动手写一个 iOS 网络请求库——封装接口
- C/S架构移动网络Socket API接口 Socket网络库 xNet框架介绍(C++封装) Demo演示示例
- libevent2.0源码学习三:对网络模型的(EPOLL)的封装
- libevent2.0源码学习三:对网络模型的(EPOLL)的封装
- 自定义一个swipe to delete listview
- Python的标准比较运算符
- 欢迎使用CSDN-markdown编辑器
- js设置断点的问题
- Disruptor 之 Ringbuffer
- 【网络库】epoll接口封装
- keepalived+mysql双主复制高可用方案
- Java之封装
- zephyr网络协议栈架构流程图
- C# 调用 C++ MFC DLL
- Spring中的AOP——在Advice方法中获取目标方法的参数
- 数字证书相关知识结构PKI/PMI基本概念、组成部分、工作原理
- 将字符串中的空字符串去掉
- Flex builder 项目运行,页面空白