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