項目完整版在:
一、channel模塊:事件管理Channel類實現(xiàn)
二、提供的功能
1.對監(jiān)控事件的管理
描述符是否可讀
描述符是否可寫
對描述符監(jiān)控可讀
對描述符監(jiān)控可寫
解除可讀事件監(jiān)控
解除可寫事件監(jiān)控
解除所有事件監(jiān)控
2.對監(jiān)控事件觸發(fā)后的處理
設置對于不同事件的回調處理函數(shù)
明確觸發(fā)了某個事件該如何處理文章來源地址http://www.zghlxwxcb.cn/news/detail-716723.html
三、實現(xiàn)思想
(一)功能
對socket套接字的操作進行封裝。文章來源:http://www.zghlxwxcb.cn/news/detail-716723.html
(二)意義
對socket套接字的操作進行封裝。
(三)功能設計
1.對監(jiān)控事件的管理
描述符是否可讀
描述符是否可寫
對描述符監(jiān)控可讀
對描述符監(jiān)控可寫
解除可讀事件監(jiān)控
解除可寫事件監(jiān)控
解除所有事件監(jiān)控
2.對監(jiān)控事件觸發(fā)后的處理
設置對于不同事件的回調處理函數(shù)
明確觸發(fā)了某個事件該如何處理
四、代碼
(一)框架
class Channel {
private:
int _fd;
uint32_t events; // 當前需要監(jiān)控的事件
uint32_t revents; // 當前連接觸發(fā)的事件
using eventCallback = std::function<void()>>;
eventCallback _read_callback; // 可讀事件被觸發(fā)的回調函數(shù)
eventCallback _error_callback; // 可寫事件被觸發(fā)的回調函數(shù)
eventCallback _close_callback; // 連接關閉事件被觸發(fā)的回調函數(shù)
eventCallback _event_callback; // 任意事件被觸發(fā)的回調函數(shù)
eventCallback _write_callback; // 可寫事件被觸發(fā)的回調函數(shù)
public:
Channel(int fd) : fd(_fd) {}
int Fd() {return _fd ;}
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(); // 啟動讀事件監(jiān)控
void enableWrite(); // 啟動寫事件監(jiān)控
void disableRead(); // 關閉讀事件監(jiān)控
void disableWrite(); // 關閉寫事件監(jiān)控
void disableAll(); // 關閉所有事件監(jiān)控
void Remove(); //移除監(jiān)控
void handleEvent(); // 事件處理,一旦觸發(fā)了某個事件,就調用這個函數(shù)!
};
(二)完整
class Channel {
private:
int _fd;
uint32_t events; // 當前需要監(jiān)控的事件
uint32_t revents; // 當前連接觸發(fā)的事件
using eventCallback = std::function<void()>>;
eventCallback _read_callback; // 可讀事件被觸發(fā)的回調函數(shù)
eventCallback _error_callback; // 可寫事件被觸發(fā)的回調函數(shù)
eventCallback _close_callback; // 連接關閉事件被觸發(fā)的回調函數(shù)
eventCallback _event_callback; // 任意事件被觸發(fā)的回調函數(shù)
eventCallback _write_callback; // 可寫事件被觸發(fā)的回調函數(shù)
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() {// 啟動讀事件監(jiān)控
_events |= EPOLLIN; // 后面會添加到EventLoop的事件監(jiān)控!
}
void enableWrite() { // 啟動寫事件監(jiān)控
_events |= EPOLLOUT; // 后面會添加到EventLoop的事件監(jiān)控!
}
void disableRead() { // 關閉讀事件監(jiān)控
_events &= ~EPOLLIN; // 后面會修改到EventLoop的事件監(jiān)控!
}
void disableWrite() { // 關閉寫事件監(jiān)控
_events &= ~EPOLLOUT;
}
void disableAll() { // 關閉所有事件監(jiān)控
_events = 0;
}
void Remove(); // 后面會調用EventLoop接口移除監(jiān)控
void HandleEvent() {
if ((_revents & EPOLLIN) || (_revents & EPOLLRDHUP) || (_revents & EPOLLPRI)) {
if (_read_callback) _read_callback();
}
/*有可能會釋放連接的操作事件,一次只處理一個*/
if (_revents & EPOLLOUT) {
if (_write_callback) _write_callback();
}
else if (_revents & EPOLLERR) {
if (_error_callback) _error_callback();//一旦出錯,就會釋放連接,因此要放到前邊調用任意回調
}else if (_revents & EPOLLHUP) {
if (_close_callback) _close_callback();
}
/*不管任何事件,都調用的回調函數(shù)*/
if (_event_callback) _event_callback();
}
};
到了這里,關于1.6.C++項目:仿muduo庫實現(xiàn)并發(fā)服務器之channel模塊的設計的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!