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 小时前
【金仓数据库产品体验官】Windows 安装 KingbaseES V9R1C10 与 Oracle 兼容特性实战
数据库
2503_924806852 小时前
动态IP使用中 报错407 怎么办???
服务器·tcp/ip·php
闭着眼睛学算法2 小时前
【华为OD机考正在更新】2025年双机位A卷真题【完全原创题解 | 详细考点分类 | 不断更新题目 | 六种主流语言Py+Java+Cpp+C+Js+Go】
java·c语言·javascript·c++·python·算法·华为od
QQ12958455042 小时前
服务器跨域问题CORS的解决
运维·服务器
小白银子2 小时前
零基础从头教学Linux(Day 42)
linux·运维·服务器·网络·nginx
ShineSpark3 小时前
C++面试11——指针与引用
c++·面试
望获linux3 小时前
【Linux基础知识系列:第一百四十篇】理解SELinux与系统安全
linux·运维·服务器·数据库·chrome·macos
Java-xy²3 小时前
AlmaLinux release 9.6服务器离线安装MySQL8.0.27详细步骤
运维·服务器·adb
杨小码不BUG3 小时前
CSP-J/S初赛知识点精讲-图论
c++·算法·图论··编码·csp-j/s初赛