C++项目:仿muduo库高并发服务器-------Channel模块实现


文章目录


前言

这个模块与其他模块关联比较强,所以些函数的设计并不完整,可以结合项目完整代码学习。


一、Channel模块

  • 功能:对⼀个描述符需要进行的IO事件管理,实现对描述符可读,可写,错误...事件的管理操作,以及IO事件监控就绪后,根据不同的事件,回调不同的处理函数功能。
  • 意义:让描述符的监控事件在用户态更易维护,触发事件后的操作流程更清晰
  • 功能设计:
    1. 对监控事件的管理:
      • 描述符是否可读
      • 描述符是否可写
      • 对描述符监控可读
      • 对描述符监控可写
      • 解除可读事件监控
      • 解除可写事件监控
      • 解除所有事件监控
    2. 对监控事件触发后的处理:
      • 设置对于不同事件的回调处理函数,明确触发某个事件后该如何处理

二、代码实现

cpp 复制代码
//描述符事件管理
class Channel{
public:
    Channel(int fd):_fd(fd){};
    //类型重命名
    using EventCallback=std::function<void()>;
    int Fd(){
        return _fd; 
    }
    //获取连接监控的事件
    uint32_t Events(){
        return _event;
    }
    //设置就序事件
    void SetREvent(uint32_t events){
        _revent=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 _event&EPOLLIN;
    }
    //当前是否监控了可写
    bool WriteAble(){
        return _event&EPOLLOUT;
    }
    //启用写事件监控
    void EnableRead(){
        _event|=EPOLLIN;
        //通过EventLoop接口设置到epoll
    }
    //启用读事件监控
    void EnableWrite(){
        _event|=EPOLLOUT;
        //...
    }
    //关闭读事件监控
    void DisableRead(){
        _event&=~EPOLLIN;
        //...
    }
    //关闭写事件监控
    void DisableWrite(){
        _event&=~EPOLLOUT;
        //...
    }
    //关闭所有事件监控
    void DisableAll(){
        _event=0;
        //...
    }
    //移除事件监控(从epoll将描述符移除)
    void Remove(){
        //通过EventLoop接口移除
    }
    //判断事件触发时该如何调用回调函数
    void HandleEvent(){
        if((_revent|EPOLLIN)||(_revent|EPOLLRDHUP)||(_revent|EPOLLPRI)){
            if(_read_callback){
                _read_callback();
            }
            //事件处理完毕刷新定时任务,防止处理期间超时
            if(_event_callback){
            _event_callback();
            }
        }
        //处理可能导致连接断开的事件,应该一次处理意见
        //如:写事件错误导致连接断开,则下面的事件没有判断的必要
        if(_revent|EPOLLOUT){
            if(_write_callback){
                _write_callback();
            }
            if(_event_callback){
            _event_callback();
            }
        }
        else if(_revent|EPOLLERR){
            if(_error_callback){
                _error_callback();
            }
        }
        else if(_revent|EPOLLHUP){
            if(_close_callback){
                _close_callback();
            }
        }
    }

private:
    int _fd;
    uint32_t _event;//当前需要监控的事件
    uint32_t _revent;//当前连接触发的事件

    EventCallback _read_callback;//可读事件触发后的回调函数   事件触发后具体行为由connect管理来决定
    EventCallback _write_callback;//可写事件触发后的回调函数
    EventCallback _error_callback;//错误事件触发后的回调函数
    EventCallback _close_callback;//连接断开事件触发的回调函数
    EventCallback _event_callback;//任意事件触发后的回调函数
};
相关推荐
倒头就睡的小比特2 天前
算法竞赛C++常用的STL
c++·算法
weilx12342 天前
C++笔记-文件IO-<fcntl.h>
c++
未济2 天前
linux 配置环境变量
linux
傲世仙尊2 天前
目录即文件-Ext文件系统收尾篇
linux·c语言
虎头金猫2 天前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
小白男神2 天前
MySQL进阶学习四(存储过程、游标、触发器)
mysql
这个DBA有点耶2 天前
MVCC深入:Read View、版本链与快照读——InnoDB并发控制的内核
数据库·mysql·架构
DBA_G2 天前
从地面到云霄:GBase数据库在民航三大场景的落地实践
数据库
Smileyqp沛沛2 天前
前端?C++ ?较大差异基础罗列
c++·基础·前端转c++
自由能燃气设备2 天前
商用全预混低氮冷凝锅炉免费方案vs付费方案对比+选型避坑指南
大数据·数据库·人工智能