Channel类主要作用:1.将文件描述符(可能是socket类型,eventfd类型,timefd类型,signalfd类型)封装,通过该类设置各种事件的回调函数(例如读回调,写回调,关闭回调等)。2.可以设置自己的监听事件类型,然后根据该类型更新poller对象(epoll或者poll)对该类的操作(例如添加,修改,删除操作)。3.根据自己监听到的事件类型触发回调函数。
1.Channel.h文件
///
///一个能被选择的 I/O channel
//这个类不拥有自己的文件描述符
/// 这个文件描述符可能是socket,eventfd, timerfd,或者 signalfd.
class Channel : noncopyable
{
public:
typedef std::function<void()> EventCallback; //事件回调
typedef std::function<void(Timestamp)> ReadEventCallback; //读事件回调
Channel(EventLoop* loop, int fd); //一个channel属于一个loop,一个loop可以对应多个channel
~Channel();
void handleEvent(Timestamp receiveTime); //处理事件
void setReadCallback(ReadEventCallback cb) //设置读回调
{
readCallback_ = std::move(cb); }
void setWriteCallback(EventCallback cb) //设置写回调
{
writeCallback_ = std::move(cb); }
void setCloseCallback(EventCallback cb) //设置关闭回调
{
closeCallback_ = std::move(cb); }
void setErrorCallback(EventCallback cb) //设置错误回调
{
errorCallback_ = std::move(cb); }
/// 将此channel与shared_ptr管理的所有者对象绑定,
///阻止shared_ptr管理的所有者对象在handleEvent被销毁
void tie(const std::shared_ptr<void>&);
int fd() const {
return fd_; }
int events() const {
return events_; } //返回注册的事件
void set_revents(int revt) {
revents_ = revt; } // 设置监听到的事件类型
// int revents() const { return revents_; }
bool isNoneEvent() const {
return events_ == kNoneEvent;