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

news/2024/9/15 20:54:53/ 标签: 服务器

下面代码是对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;}
};


http://www.ppmy.cn/news/1508770.html

相关文章

Kafka ACK机制详解笔记

1. ACK机制简介 目的&#xff1a;确保生产者发送的消息可靠地写入Kafka集群。核心&#xff1a;生产者发送消息后需等待Kafka集群的确认。 2. ACK级别 acks0&#xff1a;不等待确认&#xff0c;效率最高&#xff0c;但可能丢数据。acks1&#xff1a;等待Leader分区确认&#…

使用Numpy进行高效的Python爬虫数据处理

在当今信息爆炸的时代&#xff0c;数据无处不在&#xff0c;而爬虫技术则是从互联网上抓取数据的重要手段。然而&#xff0c;抓取到的原始数据往往需要经过清洗和处理才能转化为有用的信息。这就是Numpy库大展身手的地方。Numpy是一个开源的Python科学计算库&#xff0c;专为进…

MySQL面试题全解析:准备面试所需的关键知识点和实战经验

MySQL有哪几种数据存储引擎&#xff1f;有什么区别&#xff1f; MySQL支持多种数据存储引擎&#xff0c;其中最常见的是MyISAM和InnoDB引擎。可以通过使用"show engines"命令查看MySQL支持的存储引擎。 存储方式&#xff1a;MyISAM引擎将数据和索引分别存储在两个不…

haproxy整理

haproxy 1.1 haproxy简介 HAProxy是法国开发者 威利塔罗(Willy Tarreau) 在2000年使用C语言开发的一个开源软件 是一款具备高并发(万级以上)、高性能的TCP和HTTP负载均衡器&#xff0c;支持基于cookie的持久性&#xff0c;自动故障切换&#xff0c;支持正则表达式及web状态统…

什么是 Java?

探索 Java&#xff0c;一种多功能且功能强大的编程语言。释放其构建强大应用程序的潜力。 前言 简单来说&#xff0c;Java 是一种用于开发软件应用程序的面向对象设计的编程语言。截至 2019 年&#xff0c;它是世界上最受欢迎的编程语言&#xff0c;尤其是因为它是开源的&#…

动画魔法秀:JavaScript前端动画实战指南

标题&#xff1a;动画魔法秀&#xff1a;JavaScript前端动画实战指南 在现代Web开发中&#xff0c;动画不仅能够提升用户体验&#xff0c;还能使网页更加生动有趣。JavaScript作为实现前端动画的重要工具之一&#xff0c;提供了多种方式来创建平滑且吸引人的动画效果。本文将详…

操作系统带参的信号发送与捕获

带参的信号发送与捕获 可以让不同进程之间发送信号时&#xff0c;带上一些简易数据&#xff0c;完成不同进程之间简单通信&#xff0c;这叫带参数的信号发送 #include <signal.h> ​ int sigaction (int signum, const struct sigaction* act,struct sigaction* oldact…

给迷茫的朋友一点建议吧,主要是前端的小伙伴

每一个前端开发者&#xff0c;在职业生涯的某个阶段&#xff0c;都会遇到迷茫的时候。可能你正在困惑于技术的选择&#xff0c;可能你在犹豫要不要去学后端&#xff0c;也可能你在思考如何更快地实现自己的项目。不管你面临的是哪一种困惑&#xff0c;今天我想给你推荐一个神器…

嵌入式生物打印是什么?有啥优势?

大家好&#xff0c;今天我们来了解一下这篇《Embedded 3D bioprinting–An emerging strategy to fabricate biomimetic & large vascularized tissue constructs》发表于《Bioactive Materials》的一篇综述&#xff0c;在组织工程和再生医学领域&#xff0c;传统方法存在一…

[Android] [解决]Bottom Navigation Views Activity工程带来的fragment底部遮盖的问题

创建了Bottom Navigation Views Activity之后&#xff0c;在fragment_home.xml&#xff0c;加了一个RecyclerView&#xff0c; 后来添加了item之后发现底部会被盖住一部分。 解决&#xff1a;在layout里面加两句&#xff1a; android:paddingBottom"?attr/actionBarSize&…

MySQL进阶-MySQL管理

系统数据库 常用工具 mysql mysqladmin mysqlbinlog mysqlshow mysqldump mysqlimport/source

房产中介小程序

本文来自&#xff1a;ThinkPHPFastAdmin房产中介小程序 - 源码1688 应用介绍 产中介小程序是一款基于ThinkPHPFastAdmin开发的原生微信小程序&#xff0c;为房地产中介提供房源管理、发布、报备客户、跟踪客户以及营销推广获客等服务的系统。 前端演示&#xff1a; 后台演示&am…

【SpringMVC】SpringMVC中单元方法获取请求数据的方式

目录 1.概念 2.紧耦方式 3.解耦方式 3.1 获取请求中内容 3.1.1获取普通表单参数 3.1.2RequestParam 注解的使用 3.1.3 使用类对象作为控制单元参数 3.1.4JavaBean 和简单数据类型混合使用 3.1.5接收多个同名表单参数 3.1.6 接收日期类型参数 3.1.7 接收请求头数据 3…

C++中什么是RAII?

RAII&#xff08;Resource Acquisition Is Initialization&#xff0c;资源获取即初始化&#xff09;是一种C中常用的编程惯用法&#xff0c;用于管理资源的分配和释放。该技术的核心思想是&#xff1a;将资源的生命周期与对象的生命周期绑定&#xff0c;当对象被创建时获取资源…

DNS的反向解析

反向解析 DNS的反向解析&#xff08;Reverse DNS Lookup&#xff0c;通常缩写为rDNS&#xff09;是指通过IP地址查找与之对应的域名的过程。与正向解析&#xff08;通过域名查找IP地址&#xff09;相对&#xff0c;反向解析的主要用途是验证IP地址与域名的关联性&#xff0c;常…

蚁狮优化算法(ALO)与支持向量机(SVM)结合的预测模型及其Python和MATLAB实现

### 一、背景 随着大数据时代的到来&#xff0c;各种复杂数据的处理和分析变得至关重要。在众多数据分析方法中&#xff0c;支持向量机&#xff08;Support Vector Regression, SVR&#xff09;因其优良的回归性能而受到广泛关注。SVR通过构建一个超平面来拟合数据&#xff0c…

奇异值分解(SVD)

1 奇异值分解(SVD)简介 Beltrami 和 Jordan 被认为是奇异值分解&#xff08;Singular Value Decomposition&#xff0c;SVD&#xff09;的共同开创者&#xff0c;二人于19世纪70年代相继提出了相关理论。奇异值分解主要解决的问题是数据降维。在高维度的数据中&#xff0c;数据…

“AI+Security”系列第2期(一):对抗!大模型自身安全的攻防博弈

近日&#xff0c;由安全极客、Wisemodel 社区和 InForSec 网络安全研究国际学术论坛联合主办的“AISecurity”系列第 2 期——对抗&#xff01;大模型自身安全的攻防博弈线上活动如期举行。本次活动邀请了君同未来创始人兼 CEO 韩蒙、前阿里云高级安全专家郑瀚、ChaMd5 AI 组负…

【计算机网络】详解CA认证,预防中间者攻击!

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

提取含有特定字符的行和列grep函数(含有替换)

目录 ①grep提取含有特定字符的列 ②grep提取含有特定字符的行 R语言进行字符的替换和删减gsub&#xff0c;substr函数R语言进行字符的替换和删减gsub&#xff0c;substr函数_r语言数据框字符替换-CSDN博客 ①grep提取含有特定字符的列 在一个dataframe中&#xff0c;需要提…