C++项目:仿muduo库高并发服务器-------Channel模块实现
文章目录
- 前言
- 一、Channel模块
- 二、代码实现
前言
这个模块与其他模块关联比较强,所以些函数的设计并不完整,可以结合项目完整代码学习。
一、Channel模块
- 功能:对⼀个描述符需要进行的IO事件管理,实现对描述符可读,可写,错误…事件的管理操作,以及IO事件监控就绪后,根据不同的事件,回调不同的处理函数功能。
- 意义:让描述符的监控事件在用户态更易维护,触发事件后的操作流程更清晰
- 功能设计:
- 对监控事件的管理:
- 描述符是否可读
- 描述符是否可写
- 对描述符监控可读
- 对描述符监控可写
- 解除可读事件监控
- 解除可写事件监控
- 解除所有事件监控
- 对监控事件触发后的处理:
- 设置对于不同事件的回调处理函数,明确触发某个事件后该如何处理
- 对监控事件的管理:
二、代码实现
//描述符事件管理
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;//任意事件触发后的回调函数
};