目录
类功能
类定义
类实现
类功能
因为涉及到后续一些实现,因此后续可能会进行修改
类定义
class Channel
{
private:
uint32_t _events; // 当前需要监控的事件
uint32_t _revents; // 当前连接触发的事件
using EventCallback = std::function<void()>;
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<void()>;
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();
}
}
};
因为有写关联类并没有实现,所以无法进行调试测试,因此这一次的代码只进行了编译测试,测试发现并没有语法上的错误,后面有什么逻辑的错误只能等后续完善该类的时候再来进行测试了