当前位置: 首页 > news >正文

仿Muduo库实现高并发服务器——事件监控Poller模块

 Poller模块在整个项目的使用

下面代码是对I/O复用接口函数的基本使用。

回顾上篇文章:事件监控管理模块

这个模块是将触发事件的描述符,给到外面,让外面去做对应的处理。

#define MAX_EPOLLEVENTS 1024
class Poller {private:int _epfd;struct epoll_event _evs[MAX_EPOLLEVENTS];std::unordered_map<int, Channel *> _channels;private://对epoll的直接操作void Update(Channel *channel, int op) {// int epoll_ctl(int epfd, int op,  int fd,  struct epoll_event *ev);int fd = channel->Fd();struct epoll_event ev;ev.data.fd = fd;ev.events = channel->Events();int ret = epoll_ctl(_epfd, op, fd, &ev);if (ret < 0) {ERR_LOG("EPOLLCTL FAILED!");}return;}//判断一个Channel是否已经添加了事件监控bool HasChannel(Channel *channel) {auto it = _channels.find(channel->Fd());if (it == _channels.end()) {return false;}return true;}public:Poller() {_epfd = epoll_create(MAX_EPOLLEVENTS);if (_epfd < 0) {ERR_LOG("EPOLL CREATE FAILED!!");abort();//退出程序}}//添加或修改监控事件void UpdateEvent(Channel *channel) {bool ret = HasChannel(channel);if (ret == false) {//不存在则添加_channels.insert(std::make_pair(channel->Fd(), channel));return Update(channel, EPOLL_CTL_ADD);}return Update(channel, EPOLL_CTL_MOD);}//移除监控void RemoveEvent(Channel *channel) {auto it = _channels.find(channel->Fd());if (it != _channels.end()) {_channels.erase(it);}Update(channel, EPOLL_CTL_DEL);}//开始监控,返回活跃连接void Poll(std::vector<Channel*> *active) {// int epoll_wait(int epfd, struct epoll_event *evs, int maxevents, int timeout)int nfds = epoll_wait(_epfd, _evs, MAX_EPOLLEVENTS, -1);if (nfds < 0) {if (errno == EINTR) {return ;}ERR_LOG("EPOLL WAIT ERROR:%s\n", strerror(errno));abort();//退出程序}for (int i = 0; i < nfds; i++) {auto it = _channels.find(_evs[i].data.fd);assert(it != _channels.end());it->second->SetREvents(_evs[i].events);//设置实际就绪的事件active->push_back(it->second);}return;}
};

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【日常工作与提升式学习分享】
  • 【康复学习--LeetCode每日一题】3152. 特殊数组 II
  • 比OpenAI的Whisper快50%,最新开源语音模型
  • Apache Doris 的 Incremental Read增量读取,数据合并,数据清理
  • Java重修笔记 第三十三天 StringBuffer类、StringBuild类
  • jenkins工具配置
  • 谷歌实用Gmail技巧:批量使用多个外贸邮箱技巧
  • 《计算机组成原理》(第3版)第10章 控制单元的设计 复习笔记
  • 聊聊JS中的WebSocket
  • 2024年8月9号(frp)
  • Verilog基础:模块端口(port)定义的语法(2001标准)
  • C++基础编程100题-040 OpenJudge-1.5-01 求平均年龄
  • 大语言模型的简易可扩展增量预训练策略
  • 代码随想录算法训练营day43 | 300.最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组
  • 水库大坝安全监测:筑起水坝安全防线
  • 2017届校招提前批面试回顾
  • export和import的用法总结
  • httpie使用详解
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • Leetcode 27 Remove Element
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • PHP变量
  • 工程优化暨babel升级小记
  • 基于遗传算法的优化问题求解
  • 记一次删除Git记录中的大文件的过程
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 学习使用ExpressJS 4.0中的新Router
  • 在Unity中实现一个简单的消息管理器
  • LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件 ...
  • ​LeetCode解法汇总518. 零钱兑换 II
  • ​linux启动进程的方式
  • ​ubuntu下安装kvm虚拟机
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • ​批处理文件中的errorlevel用法
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • $NOIp2018$劝退记
  • (22)C#传智:复习,多态虚方法抽象类接口,静态类,String与StringBuilder,集合泛型List与Dictionary,文件类,结构与类的区别
  • (javascript)再说document.body.scrollTop的使用问题
  • (Java入门)学生管理系统
  • (SpringBoot)第七章:SpringBoot日志文件
  • (二)测试工具
  • (附源码)计算机毕业设计ssm电影分享网站
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • (十八)devops持续集成开发——使用docker安装部署jenkins流水线服务
  • (转)详解PHP处理密码的几种方式
  • (转)自己动手搭建Nginx+memcache+xdebug+php运行环境绿色版 For windows版
  • .NET C# 配置 Options
  • .NET HttpWebRequest、WebClient、HttpClient
  • .net mvc部分视图
  • .NET开发者必备的11款免费工具
  • ::什么意思
  • [ JavaScript ] JSON方法
  • [ 代码审计篇 ] 代码审计案例详解(一) SQL注入代码审计案例
  • []C/C++读取串口接收到的数据程序
  • [16/N]论得趣