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

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

项目完整版在:

文章目录

  • 一、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();}};

相关文章:

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

项目完整版在&#xff1a; 文章目录 一、channel模块&#xff1a;事件管理Channel类实现二、提供的功能三、实现思想&#xff08;一&#xff09;功能&#xff08;二&#xff09;意义&#xff08;三&#xff09;功能设计 四、代码&#xff08;一&#xff09;框架&#xff08;二…...

Redis代替session 实现登录流程

Redis代替session 实现登录流程 如果使用String&#xff0c;他的value&#xff0c;用多占用一点空间&#xff0c;如果使用哈希&#xff0c;则他的value中只会存储他数据本身&#xff0c;如果不是特别在意内存&#xff0c;其实使用String就可以 设计key的具体细节 在设计这个k…...

理解C++强制类型转换

理解C强制类型转换 文章目录 理解C强制类型转换理解C强制转换运算符1 static_cast1.1. static_cast用于内置数据类型之间的转换1.2 用于指针之间的转换 1.3 用于基类与派生类之间的转换2. const_cast2.1示例12.2 示例2——this指针 3.reinterpret_cast4.dynamic_cast C认为C风格…...

《TCP/IP网络编程》代码实现

文章目录 1. 项目说明1.1 项目特点2. 文件说明2.1 脚本文件2.1.1 `TCP_IP.sln`2.1.2 `xmake.lua`2.1.2.1 编译说明2.1.2.2 运行说明2.1.3 章节说明项目代码已经开源在github上! 微信公众号文章同步发表! 1. 项目说明 根据《TCP/IP网络编程》书籍学习,对其中的代码进行整理,…...

【Python】如何使用PyInstaller打包自己写好的代码

使用PyInstaller打包自己写好的代码 零、需求 最近接到一个小单&#xff0c;需要批量修改文档内容&#xff0c;用Python做好后要打包成exe程序给客户的Win7电脑使用&#xff0c;此时需要用到PyInstaller打包自己的代码&#xff0c;想到还要有给用户试用的需求&#xff0c;所以…...

Java 线程的调度与时间片

&#x1f648;作者简介&#xff1a;练习时长两年半的Java up主 &#x1f649;个人主页&#xff1a;程序员老茶 &#x1f64a; ps:点赞&#x1f44d;是免费的&#xff0c;却可以让写博客的作者开兴好久好久&#x1f60e; &#x1f4da;系列专栏&#xff1a;Java全栈&#xff0c;…...

Java项目-文件搜索工具

目录 项目背景 项目效果 SQLite的下载安装 使用JDBC操作SQLite 第三方库pinyin4j pinyin4j的具体使用 封装pinyin4j 数据库的设计 创建实体类 实现DBUtil 封装FileDao 设计scan方法 多线程扫描 周期性扫描 控制台版本的客户端 图形化界面 设计图形化界面 项目…...

记录开发中遇到关于MySQL的一些问题-MySQL版

本篇文章是记录开发中遇到关于MySQL的一些问题&#xff1a; 希望在这篇文章也能够找到你正在查找的问题&#xff0c;解决问题 Good Luck ! 关于Id 的一些问题 数据库并没有直接写SQL&#xff0c;是通过使用IDEA 同一个公司下的数据库软件生成的&#xff08;DataGrip&#xf…...

2023-10-06 LeetCode每日一题(买卖股票的最佳时机含手续费)

2023-10-06每日一题 一、题目编号 714. 买卖股票的最佳时机含手续费二、题目链接 点击跳转到题目位置 三、题目描述 给定一个整数数组 prices&#xff0c;其中 prices[i]表示第 i 天的股票价格 &#xff1b;整数 fee 代表了交易股票的手续费用。 你可以无限次地完成交易&…...

openGauss学习笔记-91 openGauss 数据库管理-内存优化表MOT管理-内存表特性-使用MOT-MOT使用MOT外部支持工具

文章目录 openGauss学习笔记-91 openGauss 数据库管理-内存优化表MOT管理-内存表特性-使用MOT-MOT使用MOT外部支持工具91.1 gs_ctl&#xff08;全量和增量&#xff09;91.2 gs_basebackup91.3 gs_dump91.4 gs_restore openGauss学习笔记-91 openGauss 数据库管理-内存优化表MOT…...

PostgreSQL快速入门

PostgreSQL快速入门&#xff1a;轻松掌握强大的开源数据库 PostgreSQL&#xff08;简称Postgres&#xff09;是一款强大、可定制且免费的开源关系型数据库管理系统&#xff08;RDBMS&#xff09;。它以其高级功能、可扩展性和安全性而著称&#xff0c;被广泛用于各种规模的项目…...

MATLAB:线性系统的建模与仿真(含完整程序)

目录 前言实验内容一、先看作业题目要求二、作业正文Modeling LTI systemsEstablish model1.tf(sys2)2. tf(sys3)3.zpk(sys1)4. zpk(sys3)5. ss(sys1)6. ss(sys2)7.[num,den] tfdata(sys1)8.[num,den] tfdata(sys2)9.[num,den] tfdata(sys3)10.[num,den] tfdata(sys1,’v’…...

mycat实现mysql读写分离

架构图&#xff1a; 视频地址...

【C++】STL详解(十一)—— unordered_set、unordered_map的介绍及使用

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;C学习 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 上一篇博客&#xff1a;【C】STL…...

【C语言】动态通讯录(超详细)

通讯录是一个可以很好锻炼我们对结构体的使用&#xff0c;加深对结构体的理解&#xff0c;在为以后学习数据结构打下结实的基础 这里我们想设计一个有添加联系人&#xff0c;删除联系人&#xff0c;查找联系人&#xff0c;修改联系人&#xff0c;展示联系人&#xff0c;排序这几…...

Mac下docker安装MySQL8.0.34

学习并记录一下如何用docker部署MySQL 在Docker中搜索并下载MySQL8.0.x的最新版本 下载好后&#xff0c;在Images中就可以看到MySQL的镜像了 通过下面的命令也可以查看docker images启动镜像&#xff0c;使用下面的命令就可以启动镜像了docker run -itd --name mysql8.0.34 -…...

基于python编写的excel表格数据标记的exe文件

目录 一、需求&#xff1a; 二、思路&#xff1a; 三、工具 四、设计过程 &#xff08;一&#xff09;根据需要导入相关的图形界面库 &#xff08;二&#xff09;创建图形窗口 &#xff08;三&#xff09;标签设计 &#xff08;四&#xff09;方法按钮设计 &#xff0…...

acwing算法基础之基础算法--高精度加法算法

目录 1 知识点2 模板 1 知识点 大整数 大整数&#xff0c;它们的长度都为 1 0 6 10^6 106。大整数是指长度为 1 0 6 10^6 106的整数。 大整数 - 大整数 大整数 * 小整数 大整数 / 小整数 把大整数存储到向量中&#xff0c;需要考虑高位在前还是低位在前&#xff0c;低位在前…...

openGauss学习笔记-84 openGauss 数据库管理-内存优化表MOT管理-内存表特性-MOT部署服务器优化:x86

文章目录 openGauss学习笔记-84 openGauss 数据库管理-内存优化表MOT管理-内存表特性-MOT部署服务器优化&#xff1a;x8684.1 BIOS84.2 操作系统环境设置84.3 网络 openGauss学习笔记-84 openGauss 数据库管理-内存优化表MOT管理-内存表特性-MOT部署服务器优化&#xff1a;x86 …...

二分查找:34. 在排序数组中查找元素的第一个和最后一个位置

个人主页 &#xff1a; 个人主页 个人专栏 &#xff1a; 《数据结构》 《C语言》《C》《算法》 文章目录 前言一、题目解析二、解题思路1. 暴力查找2. 一次二分查找 部分遍历3. 两次二分查找分别查找左右端点1.查找区间左端点2. 查找区间右端点 三、代码实现总结 前言 本篇文…...

SAP S/4HANA 利润中心(PCA)完整配置步骤

SAP S/4HANA 利润中心&#xff08;PCA&#xff09;完整配置步骤按项目上线标准顺序一步步来&#xff0c;从零到可用&#xff0c;含前台 后台、必配 可选&#xff0c;通俗易懂不绕弯路一、前期基础前提&#xff08;必须先做好&#xff09;公司代码、控制范围已创建控制范围与公…...

Go语言Envoy实战:高性能代理与负载均衡

Go语言Envoy实战&#xff1a;高性能代理与负载均衡 1. Envoy概述 Envoy是Lyft开源的高性能代理&#xff0c;常作为服务网格的数据平面&#xff0c;提供负载均衡、熔断、重试等功能。 2. Go控制平面实现 package envoyimport ("api/envoy/api/v2/core""api/envoy…...

ustcthesis与Overleaf完美结合:云端LaTeX写作新体验

ustcthesis与Overleaf完美结合&#xff1a;云端LaTeX写作新体验 【免费下载链接】ustcthesis LaTeX template for USTC thesis 项目地址: https://gitcode.com/gh_mirrors/us/ustcthesis 在当今数字化写作时代&#xff0c;ustcthesis作为中国科学技术大学官方的学位论文…...

SITS2026正式发布倒计时72小时:这4类AI研发团队已紧急升级知识治理体系,你还在用Wiki+钉钉硬扛?

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;AI研发知识管理&#xff1a;SITS2026专题 核心挑战与范式演进 AI研发正从单点模型训练转向全生命周期知识协同——SITS2026&#xff08;Semantic Intelligence & Traceable Systems 2026&#xf…...

Claude 4.6 Opus 算力升级:中小企业 AI 混合部署最佳实践

2026 年 5 月&#xff0c;随着 SpaceX 与 Anthropic 算力合作的正式落地&#xff0c;Claude 4.6 Opus 的服务稳定性和并发处理能力得到了质的提升&#xff0c;同时 Anthropic 维持了 Claude Pro 用户免费使用 Opus 的权益不变&#xff0c;dd.zzmax.cn 已整理了针对中小企业的 C…...

code-outline:为AI编程助手设计的代码结构导航工具,节省90% Token消耗

1. 项目概述&#xff1a;为AI编程助手打造的代码结构导航仪如果你和我一样&#xff0c;日常开发中重度依赖像Claude Code、Cursor Agent或者Aider这类AI编程助手&#xff0c;那你肯定遇到过这个痛点&#xff1a;想让AI帮你理解一个陌生项目&#xff0c;或者修改一个大型文件里的…...

创业公司利用Taotoken多模型能力进行A/B测试以优化产品效果

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 创业公司利用Taotoken多模型能力进行A/B测试以优化产品效果 对于AI产品创业团队而言&#xff0c;选择合适的大模型是产品成功的关键…...

AI伦理编程实战:从公平性算法到可解释性模型的工程实践

1. 项目概述&#xff1a;当代码开始思考&#xff0c;我们该教它什么&#xff1f; “AI伦理编程”这个词&#xff0c;听起来像是一个技术乌托邦&#xff0c;一个我们只要遵循几条规则就能让机器变得善良的简单任务。但当你真正坐下来&#xff0c;试图将“公平”、“透明”、“无…...

【2026最硬核LLM加速框架】:仅用7行Triton内核重写Attention,吞吐翻3.2倍——SITS现场调试录屏首曝

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;AI原生性能优化&#xff1a;SITS 2026 LLM推理加速实战技巧 在 SITS 2026 基准测试中&#xff0c;LLM 推理延迟与显存带宽利用率高度相关。AI 原生优化强调从计算图调度、内核融合到硬件亲和性配置的端…...

Rust Trait系统深度解析:从基础到高级应用

Rust Trait系统深度解析&#xff1a;从基础到高级应用 引言 Trait是Rust中实现代码复用和多态的核心机制。通过Trait&#xff0c;我们可以定义共享行为&#xff0c;并为不同类型实现这些行为。 本文将深入探讨Rust Trait系统的核心概念、高级特性和最佳实践。 一、Trait基础 1.…...