Channel事件管理类实现(模块三)

目录

类功能

类定义

类实现


类功能

Channel事件管理类实现(模块三)_第1张图片

因为涉及到后续一些实现,因此后续可能会进行修改

类定义

class Channel
{
private:
    uint32_t _events;  // 当前需要监控的事件
    uint32_t _revents; // 当前连接触发的事件
    using EventCallback = std::function;
    EventCallback _read_callback;  // 可读事件被触发的回调函数
    EventCallback _write_callback; // 可写事件被触发的回调函数
    EventCallback _error_callback; // 错误事件被触发的回调函数
    EventCallback _close_callback; // 连接断开事件被触发的回调函数
    EventCallback _event_callback; // 任意事件被触发的回调函数
public:
    Channel();
    void SetReadCallback(const EventCallback &cb);
    void SetWriteCallback(const EventCallback &cb);
    void SetErrorCallback(const EventCallback &cb);
    void SetCloseCallback(const EventCallback &cb);
    void SetEventCallback(const EventCallback &cb);
    bool ReadAble();     // 当前是否监控了可读
    bool WriteAble();    // 当前是否监控了可写
    void EnableRead();   // 启动读事件监控
    void EnableWrite();  // 启动写事件监控
    void DisableRead();  // 关闭读事件监控
    void DisableWrite(); // 关闭写事件监控
    void Remove();       // 移除监控
    void HandleEvent();  // 事件处理,一旦触发了事件,就调用这个函数,自己触发了什么事件如何处理自己决定
};

类实现

// Channel类
class Channel
{
private:
    int _fd;
    uint32_t _events;  // 当前需要监控的事件
    uint32_t _revents; // 当前连接触发的事件
    using EventCallback = std::function;
    EventCallback _read_callback;  // 可读事件被触发的回调函数
    EventCallback _write_callback; // 可写事件被触发的回调函数
    EventCallback _error_callback; // 错误事件被触发的回调函数
    EventCallback _close_callback; // 连接断开事件被触发的回调函数
    EventCallback _event_callback; // 任意事件被触发的回调函数
public:
    Channel(int fd) : _fd(fd) {}
    int Fd() { return _fd; }
    void SetREvents(uint32_t events) { _revents = 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 (_events & EPOLLIN); }
    // 当前是否监控了可写
    bool WriteAble() { return (_events & EPOLLOUT); }  
    // 启动读事件监控  
    void EnableRead() { _events |= EPOLLIN; /*..后边会添加到EventLoop的事件监控中*/}
    // 启动写事件监控
    void EnableWrite() { _events |= EPOLLOUT; /*..后边会添加到EventLoop的事件监控中*/}
    // 关闭读事件监控  
    void DisableRead() { _events &= ~EPOLLIN; /*..后边会添加到EventLoop的事件监控中*/}
    // 关闭写事件监控
    void DisableWrite() { _events &= ~EPOLLOUT; /*..后边会添加到EventLoop的事件监控中*/} 
    // 关闭所有事件监控
    void DisableAdd() { _events = 0; }
    // 移除监控
    void Remove() { /* 后边会调用EventLoop来移除监控*/ }
    // 事件处理,一旦触发了事件,就调用这个函数,自己触发了什么事件如何处理自己决定
    void HandleEvent()
    {
        // 第二参数,对方关闭连接,第三参数,带外数据
        if ((_revents & EPOLLIN) || (_revents & EPOLLRDHUP) || (_revents & EPOLLPRI))
        {
            if (_read_callback)
                _read_callback();
            if (_event_callback) // 不管任何事件,都调用的回调函数
                _event_callback();
        }
        /*有可能会释放连接的操作事件,一次只处理一个*/
        if (_revents & EPOLLOUT)
        {
            if (_write_callback)
                _write_callback();
            if (_event_callback)
                _event_callback(); // 放到事件处理完毕后调用,刷新活跃度
        }
        else if (_revents & EPOLLERR)
        {
            if (_event_callback)
                _event_callback();
            if (_error_callback)
                _error_callback();
        }
        else if (_revents & EPOLLHUP)
        {
            if (_event_callback)
                _event_callback();
            if (_close_callback)
                _close_callback();
        }
    }
};

因为有写关联类并没有实现,所以无法进行调试测试,因此这一次的代码只进行了编译测试,测试发现并没有语法上的错误,后面有什么逻辑的错误只能等后续完善该类的时候再来进行测试了

你可能感兴趣的:(mudo,c++,服务器)