從epoll構建muduo-5 加入Acceptor和TcpConnection

mini-muduo版本傳送門
version 0.00 從epoll構建muduo-1 mini-muduo介紹
version 0.01 從epoll構建muduo-2 最簡單的epoll
version 0.02 從epoll構建muduo-3 加入第一個類,順便介紹reactor
version 0.03 從epoll構建muduo-4 加入Channel
version 0.04 從epoll構建muduo-5 加入Acceptor和TcpConnection
version 0.05 從epoll構建muduo-6 加入EventLoop和Epoll
version 0.06 從epoll構建muduo-7 加入IMuduoUser
version 0.07 從epoll構建muduo-8 加入發送緩衝區和接收緩衝區
version 0.08 從epoll構建muduo-9 加入onWriteComplate回調和Buffer
version 0.09 從epoll構建muduo-10 Timer定時器
version 0.11 從epoll構建muduo-11 單線程Reactor網絡模型成型
version 0.12 從epoll構建muduo-12 多線程代碼入場
version 0.13 從epoll構建muduo-13 Reactor + ThreadPool 成型

mini-muduo v0.04版本,這是個版本最重要的修改是加入了兩個類Acceptor和TcpConnection。完整可運行的示例可從github下載,使用命令git checkout v0.04可切換到此版本,在線瀏覽此版本到這裏

1 回顧下v0.03版本,所有的socket事件都是在TcpServer::OnIn(命名不規範後續會改動)裏處理的,包括接受新連接和讀寫數據,那實在是沒有辦法的辦法,現在加入了Acceptor和TcpConnection,終於可以將事件分配到獨立的類處理了,這也是應該的,因爲接受連接和讀寫數據根本就是兩種性質的事件,處理方式也完全不同,理應放到兩個不同的類中。

2 Acceptor類的作用就是處理新連接,Acceptor裏的Channel關注着用於listen的socket,一旦有連接到達,就將連接accept下來(...這不廢話嘛)。注意accept後還有個重要的步驟,就是回調一下TcpServer,使得後者有機會創建TcpConnection,這裏爲什麼不直接在Acceptor裏新建TcpConnection而是將其放到TcpServer裏,我想在邏輯上新socket建立後就和之前用於listen的socket沒有任何關係了,TcpConnection和Acceptor分別關心不同的socket上的不同事件,這兩個類是平行的關係,如果前者創建後者,又牽扯生命週期的管理邏輯上不太合適,由TcpServer來掌握兩者的生命週期更合適些。

3 TcpConnection的作用很關鍵,在當前版本上只是用來簡單處理socket的讀寫事件,後續會將TcpConnection傳遞給庫的用戶,將讀寫權利轉交給用戶。

4 回顧一下之前介紹過的reactor模型,對照我們新添加的兩個類,其實Acceptor和TcpConnection就是兩個Concrete Event Handler,在的Douglas C. Schmidt文檔裏,這兩個Handler一個叫做Logging Acceptor,另一個叫做Logging Handler,名字和我們的有些不同,個人覺得muduo裏的名字更好理解。

5 只顧低頭拉車不顧擡頭看路,這個版本引入了4個Memory leak(代碼中都有明確註釋),不過我想C++程序員是最有辦法管理對象生命週期的,我們先忽略它。

6 這個版本還是問題多多,後續不斷改進。

發佈了28 篇原創文章 · 獲贊 46 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章