epoll技術前兩節已經闡述過了,目前主要做一下封裝,很多epoll的服務器都是采用事件回調方式處理,
其實並沒有什么復雜的,我慢慢給大家闡述下原理。
在networking.h和networking.cpp里,這兩個文件主要實現了一些文件讀寫功能的回調函數
。
acceptCallBack 負責新的描述符連接上來進行回調,
readCallBack 負責讀操作回調
writeCallBack 負責寫操作回調
initListenSocket 負責初始化描述符的基本信息
setNonblock負責設置描述符非阻塞
bindListenSocket負責綁定描述符
實現如下
這些回調函數會賦值給EventLoop 的proc里,實現綁定,因為以后要回調
creatEventLoop為了創建並且初始化一個eventLoop
deleteEventLoop刪除一個eventloop
CreateFileEvent將一個fd綁定到對應的epoll事件中,並且綁定fd對應的FileEvent事件類型和回調函數
DeleteFileEvent將一個fd解綁epoll事件,並且解綁fd對應的fileEvent事件類型和回調函數
ProcessEvents,輪詢處理所有epoll就緒事件,並且調用之前注冊好的回調函數
實現如下
上一部分將文件描述符加入epoll監聽隊列,以及從監聽隊列刪除對應fd,或者輪詢就緒事件都被我封裝在apiepoll.h
和apiepoll.cpp里。
ApiState是基於epoll封裝的結構體
epfd表示epoll create產生的句柄
events表示epoll監聽的事件隊列,這個大小可以自己開辟,一般都是
最大的客戶端連接數+保留的一部分空間
ApiCreate表示創建epoll結構和句柄,將數據存儲到eventLoop里
ApiResize重新開辟epoll序列大小
ApiFree釋放epoll events
ApiAddEvent 將事件類型添加到epoll監聽序列里
ApiDelEvent 將事件類型從epoll監聽序列里刪除
ApiPoll,就是epoll調用epoll_wait,返回就緒事件隊列
輪詢處理,回調函數就可以了
源代碼下載地址:http://download.csdn.net/detail/secondtonone1/9502252
關注我的公眾號平台,定期推送技術總結