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;//任意事件触发后的回调函数
};
相关推荐
Aloha_up2 小时前
redis与数据库的一致性问题分析
数据库·redis·缓存
波特率1152002 小时前
C++中类的const与static关键字修饰函数与变量辨析
开发语言·c++·
牢七2 小时前
jfinal_cms-v5.1.0 审计黑盒
数据库
lightqjx2 小时前
【算法】前缀和
c++·算法·leetcode·前缀和
zzh0812 小时前
MySQL数据库操作笔记
数据库·笔记·mysql
6+h2 小时前
【Redis】底层原理解析(SDS / 跳表 / IO多路复用 / 单线程模型)
数据库·redis·bootstrap
idolao3 小时前
CentOS 7 安装 nginx-1.3.15.tar.gz 详细步骤(从源码编译到启动配置)
linux·运维·数据库
@encryption3 小时前
TCP,IP
服务器·网络·tcp/ip
EnCi Zheng3 小时前
J7A-已有数据表如何安全添加新字段 [特殊字符]️
数据库·安全·oracle
汉克老师3 小时前
GESP5级C++考试语法知识(七、链表(二)双链表)
c++·链表·双链表·gesp5级·gesp五级