当前位置: 首页 > 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();}};
http://www.lryc.cn/news/183855.html

相关文章:

  • Redis代替session 实现登录流程
  • 理解C++强制类型转换
  • 《TCP/IP网络编程》代码实现
  • 【Python】如何使用PyInstaller打包自己写好的代码
  • Java 线程的调度与时间片
  • Java项目-文件搜索工具
  • 记录开发中遇到关于MySQL的一些问题-MySQL版
  • 2023-10-06 LeetCode每日一题(买卖股票的最佳时机含手续费)
  • openGauss学习笔记-91 openGauss 数据库管理-内存优化表MOT管理-内存表特性-使用MOT-MOT使用MOT外部支持工具
  • PostgreSQL快速入门
  • MATLAB:线性系统的建模与仿真(含完整程序)
  • mycat实现mysql读写分离
  • 【C++】STL详解(十一)—— unordered_set、unordered_map的介绍及使用
  • 【C语言】动态通讯录(超详细)
  • Mac下docker安装MySQL8.0.34
  • 基于python编写的excel表格数据标记的exe文件
  • acwing算法基础之基础算法--高精度加法算法
  • openGauss学习笔记-84 openGauss 数据库管理-内存优化表MOT管理-内存表特性-MOT部署服务器优化:x86
  • 二分查找:34. 在排序数组中查找元素的第一个和最后一个位置
  • javaee ssm框架项目整合thymeleaf2.0 更多thymeleaf标签用法 项目结构图
  • lv7 嵌入式开发-网络编程开发 11 TCP管理与UDP协议
  • overleaf在线编辑工具使用教程
  • Python基础复习【第一弹】【黑马】
  • 【Word】公式编辑器中连字符/减号等显示偏长/过长
  • 架构设计系列4:如何设计高性能架构
  • 1392. 最长快乐前缀
  • 【C++设计模式之备忘录模式:行为型】分析及示例
  • 数据结构与算法(四):哈希表
  • FFmpeg 命令:从入门到精通 | ffplay 播放控制选项
  • 代码随想录day59