项目模块四:Channel模块
一、模块目的
对描述符监控事件的管理。
二、模块设计
1、成员变量
套接字:int _sockfd
需要关心的事件:uint32_t _events
已经触发的事件:uint32_t _revents
需要设置的回调函数:都回调,写回调,任意事件回调,错误回调,连接关闭回调。
2、成员函数
(1)设置触发事件 void SetRevents(uint32_t revents)
_revents = revents;
(2)获取套接字 void Sockfd()
return _sockfd;
(3)获取需要关心的事件 void Events()
return _events;
(4)读 / 写事件是否就续
return _revents & EPOLLIN;
return _revents & EPOLLOUT;
(5)关心读 / 写事件
_events | EPOLLIN;
_events | EPOLLOUT;
(*)
(6)删除读 / 写事件关心
其实就是把特定比特位由0置1
_events &= (~EPOLLIN);
_events &= (~EPOLLOUT);
(*)
(7)关闭所有事件
_events = 0;
(*)
(8)移除事件监控
暂时无法实现,预计流程:调用 eventloop 模块中的子模块 poller 模块接口实现。(*)
(9)设置回调函数
不由 Channel 模块决定。
预计流程:tcpserver 模块 -> Connection 模块 -> Channel 模块
(10)处理触发事件
有 EPOLLIN, EPOLLPRI(优先带外数据), EPOLLRDHUP(半关闭连接,读端写端一端关闭) 就调用读回调和任意事件回调。
有 EPOLLIOUT 就调用写回调和任意事件回调。
有 EPOLLERR, EPOLLHUP(连接关闭) 就分别调用错误回调和连接关闭回调。注意由于两个都是错误,本质会关闭连接,所以只要有一种情况得到处理即可,用 else if