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;//任意事件触发后的回调函数
};
相关推荐
点心快奔跑3 分钟前
超详细Windows系统MySQL 安装教程
数据库·windows·mysql
刘一说4 分钟前
CentOS Stream 网络故障排查:静态IP丢失、无法访问的完整解决方案
linux·tcp/ip·centos
硬核子牙5 分钟前
gdb调试多线程底层实现原理
linux
用户6135411460168 分钟前
OceanBase all-in-one 4.2.0.0 安装教程(CentOS 7/EL7 一键部署详细步骤)
linux
橘子1316 分钟前
Linux网络(二)——socket编程
linux·网络
饕餮怪程序猿22 分钟前
C++:大型语言模型与智能系统底座的隐形引擎
c++·人工智能
lxmyzzs23 分钟前
在使用 `resolvconf` 的 Ubuntu 系统上持久化 DNS 设置
linux·运维·ubuntu
nassi_30 分钟前
文件属性获取与目录IO操作详解
linux·服务器·网络
超级苦力怕31 分钟前
【超详细】Redis下载教程 (Win/Linux)
数据库
程序员龙一31 分钟前
C++之lambda表达式使用解读
c++·lambda