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

news/2025/3/17 9:26:36/

下面代码是对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;今天我想给你推荐一个神器…