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;//任意事件触发后的回调函数
};
相关推荐
koi77u2 小时前
嵌入式学习————————TCP并发服务器(1)
linux·学习
tanzongbiao3 小时前
Dorado7文件上传 解决HttpServletResponse返回值中文乱码的问题
java·服务器·前端
2601_962056235 小时前
易信easyMarkets:澄清诈骗疑问时更应关注官方出金流程
mysql
2603_965148117 小时前
家居百货蓝海:API挖掘高复购率生活小商品
大数据·服务器·人工智能·python·生活
上学的小垃圾10 小时前
基于docker安装MySQL(openEuler系统)
linux·mysql·docker·容器
cui_ruicheng11 小时前
LangChain 应用开发(十四):Agent 上下文与记忆机制
服务器·人工智能·python·langchain
一直C12 小时前
Linux网络编程|HTTP协议详解(报文、请求方法、状态码)
linux·http·wireshark·vim·visual studio
倔强的石头_12 小时前
连接数失控排查:从数据库会话、应用线程池到连接池泄漏
数据库
hzxpaipai12 小时前
企业官网技术架构拆解:前端、后台、数据库、服务器如何协同
前端·数据库·架构
爱吃火鸡面呀13 小时前
MySQL DQL 子查询详解:从标量、列、行到表子查询的完整实战
大数据·数据库·mysql