1.6.C++项目:仿mudou库实现并发服务器之channel模块的设计

news2024/11/27 1:26:57

项目完整版在:

文章目录

  • 一、channel模块:事件管理Channel类实现
  • 二、提供的功能
  • 三、实现思想
    • (一)功能
    • (二)意义
    • (三)功能设计
  • 四、代码
    • (一)框架
    • (二)完整

一、channel模块:事件管理Channel类实现

在这里插入图片描述

二、提供的功能

1.对监控事件的管理
描述符是否可读
描述符是否可写
对描述符监控可读
对描述符监控可写
解除可读事件监控
解除可写事件监控
解除所有事件监控
2.对监控事件触发后的处理
设置对于不同事件的回调处理函数
明确触发了某个事件该如何处理

三、实现思想

(一)功能

对socket套接字的操作进行封装。

(二)意义

对socket套接字的操作进行封装。

(三)功能设计

1.对监控事件的管理
描述符是否可读
描述符是否可写
对描述符监控可读
对描述符监控可写
解除可读事件监控
解除可写事件监控
解除所有事件监控
2.对监控事件触发后的处理
设置对于不同事件的回调处理函数
明确触发了某个事件该如何处理

四、代码

(一)框架

class Channel {

        private:
                int _fd;
                uint32_t events;  // 当前需要监控的事件
                uint32_t revents; // 当前连接触发的事件
                using eventCallback = std::function<void()>>;
                eventCallback _read_callback;  // 可读事件被触发的回调函数
                eventCallback _error_callback; // 可写事件被触发的回调函数
                eventCallback _close_callback; // 连接关闭事件被触发的回调函数
                eventCallback _event_callback; // 任意事件被触发的回调函数
                eventCallback _write_callback; // 可写事件被触发的回调函数
        public:
                Channel(int fd) : fd(_fd) {}
                int Fd() {return _fd ;}
                void setReadCallback(const eventCallback &cb);
                void setWriteCallback(const eventCallback &cb);
                void setErrorCallback(const eventCallback &cb);
                void setCloseCallback(const eventCallback &cb);
                void setEventCallback(const eventCallback &cb);
                bool readAble();   // 当前是否可读
                bool writeAble();  // 当前是否可写
                void enableRead(); // 启动读事件监控
                void enableWrite(); // 启动写事件监控
                void disableRead();     // 关闭读事件监控
                void disableWrite(); // 关闭写事件监控
                void disableAll();  // 关闭所有事件监控
                void Remove();  //移除监控
                void handleEvent(); // 事件处理,一旦触发了某个事件,就调用这个函数!

};

(二)完整

class Channel {

        private:
                int _fd;
                uint32_t events;  // 当前需要监控的事件
                uint32_t revents; // 当前连接触发的事件
                using eventCallback = std::function<void()>>;
                eventCallback _read_callback;  // 可读事件被触发的回调函数
                eventCallback _error_callback; // 可写事件被触发的回调函数
                eventCallback _close_callback; // 连接关闭事件被触发的回调函数
                eventCallback _event_callback; // 任意事件被触发的回调函数
                eventCallback _write_callback; // 可写事件被触发的回调函数
        public:
                Channel(int fd) : fd(_fd) {}
                int Fd() {return _fd ;}
                void SetRevents(uint32_t events) {_revents = events; }
                void setReadCallback(const eventCallback &cb) { _read_callback = cb;}
                void setWriteCallback(const eventCallback &cb) { _write_callback = cb; }
                void setErrorCallback(const eventCallback &cb) { _error_callback = cb; }
                void setCloseCallback(const eventCallback &cb) { _close_callback = cb; }
                void setEventCallback(const eventCallback &cb) { _event_callback = cb; }
                bool readAble() {  // 当前是否可读 
                        return (_events & EPOLLIN);
                }
                bool writeAble() {  // 当前是否可写
                        return (_events & EPOLLOUT);
                }
                void enableRead() {// 启动读事件监控
                        _events |= EPOLLIN; // 后面会添加到EventLoop的事件监控!
                }
                void enableWrite() { // 启动写事件监控 
                        _events |= EPOLLOUT; // 后面会添加到EventLoop的事件监控!
                }
                void disableRead() {    // 关闭读事件监控
                        _events &= ~EPOLLIN;   // 后面会修改到EventLoop的事件监控!
                }
                void disableWrite() { // 关闭写事件监控 
                        _events &= ~EPOLLOUT;
                }
                void disableAll() { // 关闭所有事件监控
                        _events = 0;
                }
                void Remove();  // 后面会调用EventLoop接口移除监控
                void HandleEvent() {
                        if ((_revents & EPOLLIN) || (_revents & EPOLLRDHUP) || (_revents & EPOLLPRI)) {
                        
                                if (_read_callback) _read_callback();
                                }
                        /*有可能会释放连接的操作事件,一次只处理一个*/
                                if (_revents & EPOLLOUT) {
                                if (_write_callback) _write_callback();
                                }
                                else if (_revents & EPOLLERR) {
                                if (_error_callback) _error_callback();//一旦出错,就会释放连接,因此要放到前边调用任意回调
                                }else if (_revents & EPOLLHUP) {
                                if (_close_callback) _close_callback();
                                }
                        /*不管任何事件,都调用的回调函数*/
                        if (_event_callback) _event_callback();
        }

};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1053079.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

快速上手 Docker Swarm:构建分布式容器集群、轻松管理节点和服务

什么是Docker Swarm Docker Swarm 是 Docker 的内置编排工具&#xff0c;它允许将多个 Docker 主机组成一个集群&#xff0c;并以统一的方式管理和部署容器化应用程序。Swarm 提供了高可用性、伸缩性和容错能力&#xff0c;使得应用程序能够在集群中弹性地运行和扩展。 Docke…

唤醒手腕 Matlab 游戏编程常用技术知识点详细教程(更新中)

Figure 窗口初始化 figure 使用默认属性值创建一个新的图窗窗口。生成的图窗为当前图窗。f figure(___) 返回 Figure 对象。可使用 f 在创建图窗后查询或修改其属性。figure(f) 将 f 指定的图窗作为当前图窗&#xff0c;并将其显示在其他所有图窗的上面。 figure(n) 查找 Nu…

8、Docker-compose容器编排

一、Docker compose 是什么 Compose 是 Docker 公司推出的一个工具软件&#xff0c;可以管理多个 Docker 容器组成一个应用。你需要定义一个 YAML 格式的配置文件docker-compose.yml&#xff0c;写好多个容器之间的调用关系。然后&#xff0c;只要一个命令&#xff0c;就能同…

cadence SPB17.4 S032 - 使用room来放置元件

文章目录 cadence SPB17.4 S032 - 使用room来放置元件概述笔记在orcad中设置子原理图的ROOM号码在空的Allegro工程中, 放入板框在allegro中建立room备注补充 - ROOM还得留着END cadence SPB17.4 S032 - 使用room来放置元件 概述 如果在allegro中直接手工或自动放置元件, 放好…

scala基础入门

一、Scala安装 下载网址&#xff1a;Install | The Scala Programming Language ideal安装 &#xff08;1&#xff09;下载安装Scala plugins &#xff08;2&#xff09;统一JDK环境&#xff0c;统一为8 &#xff08;3&#xff09;加载Scala &#xff08;4&#xff09;创建工…

单调队列 - 滑动窗口

154. 滑动窗口 - AcWing题库 O(1)求窗口中的最大值/最小值 #include<bits/stdc.h> #define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); #define endl \nusing namespace std;typedef pair<int, int> PII; typedef long long ll; typedef long double l…

gdb的使用

目录 gdb工具的使用 代码调试相关指令 运行程序指令 r 显示代码的指令 l 给代码打断点 b 查看断点位置 info b 执行代码到断点处停止 关闭断点 d断点编号 关闭某个断点&#xff0c;但不删除 disable编号 打开某个断点 enable断点编号 逐过程调试代码 n 逐语句调试代码 s 查看…

【外设】拓展坞接入外设一直弹窗报错问题

外设相关&#xff1a;多功能拓展坞安装后使用正常但计算机一直弹窗报错 1.基本配置信息&#xff1a; 拓展坞&#xff1a;绿联6合1 笔记本&#xff1a;lenovo &#xff08;硬件:13^i5;系统&#xff1a;win11&#xff09; 外设&#xff1a;1键1鼠1显示器1硬盘 2.存在的问题&am…

LNK2001: unresolved external symbol __imp___std_init_once_begin_initialize 问题解决

LNK2001: unresolved external symbol __imp___std_init_once_begin_initialize 解决 文章目录 问题背景方法一&#xff1a;使用预编译指令方法二&#xff1a;使用相同的环境 参考链接附录 问题背景 Visual Studio 2019 对 CMakeLists.txt 的支持不是很好&#xff0c;使用 “文…

【单片机】12-串口通信和RS485

1.通信有关的常见概念 区分&#xff1a;串口&#xff0c;COM口&#xff0c;UART&#xff0c;USART_usart和串口区别-CSDN博客 串口、COM口、UART口, TTL、RS-232、RS-485区别详解-CSDN博客 1.什么是通信 &#xff08;1&#xff09;人和人之间的通信&#xff1a;说话&#xff…

java项目之校园餐厅管理(ssm源码+文档)

项目简介 校园餐厅管理实现了以下功能&#xff1a; 管理员&#xff1a;个人中心、商家管理、用户管理、菜系类别管理、校园美食管理、在线下单管理、美食论坛、系统管理。商家前台&#xff1a;首页、校园美食、论坛信息、新闻资讯、我的、跳转到后台、客服。商家&#xff1a;…

第4讲:vue内置命令(文本插值,属性绑定,v-text,v-html)

MVVM 什么是MVVM&#xff1f; MVVM是Model-View-ViewModel的简写。它本质上就是MVC 的改进版。MVVM 就是将其中的View 的状态和行为抽象化&#xff0c;让我们将视图 UI 和业务逻辑分开。 View层&#xff1a; 视图层 在我们前端开发中&#xff0c;通常就是 DOM 层。 主要的作用是…

Error: Activity class {xxx.java} does not exist

git切换到不同的branch之后&#xff0c;报下面的错误&#xff1a; Error: Activity class {xxx.java} does not exist 解决方案&#xff1a; 首先clean 然后会删除build目录 然后点击&#xff1a;Invalidate Caches Android Studio重启&#xff0c;然后重新build即可。

四、2023.9.30.C++面向对象end.4

文章目录 49、 简述一下什么是常函数&#xff0c;有什么作用&#xff1f;50、 说说什么是虚继承&#xff0c;解决什么问题&#xff0c;如何实现&#xff1f;51、简述一下虚函数和纯虚函数&#xff0c;以及实现原理&#xff1f;52、说说纯虚函数能实例化吗&#xff0c;为什么&am…

Python实验二

1&#xff1a;编程计算 1&#xff5e;100 偶数的和。 要求&#xff1a;输出结果为整数&#xff0c;宽度为 8&#xff0c;居中对齐&#xff0c;空白处填充符号“*”。 提示&#xff1a; range(2,101,2)生成的整数列表从 2 开始到 100 结束&#xff0c;步长为 2&#xff0c;即 …

华为云云耀云服务器L实例评测|云耀云服务器L实例部署Linux管理面板mdserver-web

华为云云耀云服务器L实例评测&#xff5c;云耀云服务器L实例部署Linux管理面板mdserver-webl 一、云耀云服务器L实例介绍1.1 云耀云服务器L实例简介1.2 云耀云服务器L实例特点 二、mdserver-web介绍2.1 mdserver-web简介2.2 mdserver-web特点2.3 主要插件介绍 三、本次实践介绍…

高数:第二章:一元函数微分学

文章目录 一、导数与微分1.导数的概念(1)导数的定义(2)左右导数(3)定理&#xff1a;可导与左右导数的关系(4)可导三要素(5)用导数定义判断可导性 2.微分的概念(1)微分的定义(2)微分与可导的关系 3.导数与微分的几何意义(1)导数 f ′ ( x 0 ) f(x_0) f′(x0​)的几何意义&#x…

【LLM】Windows10环境部署阿里通义千问大模型(Qwen-14B-Chat-Int4)

文章目录 环境文件准备项目代码模型相关文件 运行准备工作运行demo Tips 环境 系统版本&#xff1a;Windows 10 企业版 版本号&#xff1a;20H2 系统类型&#xff1a;64 位操作系统, 基于 x64 的处理器 处理器&#xff1a;Intel Core™ i7-13700K CPU 3.40GHz 机带 RAM&#…

1340. 跳跃游戏 V;2039. 网络空闲的时刻;2767. 将字符串分割为最少的美丽子字符串

1340. 跳跃游戏 V 核心思想&#xff1a;动态规划记忆化搜索。定义dfs(i)&#xff0c;表示从i开始最多可以访问多少个下标&#xff0c;然后统计往左跳和往右边跳的最大值&#xff0c;思路其实比较简单&#xff0c;但是代码我感觉还是不太好想。 2039. 网络空闲的时刻 核心思想…

CH347读写SPI Flash

CH347读写SPI Flash 前面耽搁了几天&#xff0c;今天终于把CH347 SPI接口调试好了。 CH347动态库中SPI接口函数如下&#xff1a; typedef struct _SPI_CONFIG{UCHAR iMode; // 0-3:SPI Mode0/1/2/3UCHAR iClock; // 060…