分為幾個模塊 EventLoop、TcpServer、Acceptor、TcpConnection、Channel等
對EventLoop來講:
他只關注里面的主驅動力,EventLoop中只關注poll,這類系統調用使得其成為Reactor模式,EventLoop中有屬于這個loop的所有Channel,這個loop屬于哪個Server.
幾個類存在的意義:
從利用層使用的角度來看,用戶需要初始化1個EventLoop,然后初始化1個TcpServer(固然也能夠自定義個TcpServer,自定義數據處理函數需要注冊到TcpServer內),然后調用TcpServer的start函數,然后調用EventLoop的loop()函數。全部用戶層的使用流程就是這樣的!
從用戶層的利用方法來解析Muduo庫的設計思想:
首先來看TcpServer這個類,從名字來看,它是1個http://www.vxbq.cn/server/,里面肯定需要有1個用于監聽某個地址的套接字,這個是Acceptor類,這是由TcpServer引出的第1個類,在Acceptor類中封裝了監聽套接字,Acceptor負責了1個socketfd,這個socketfd就是1個監聽套接字。當這個套接字上有可讀事件時,調用了Acceptor的handleRead函數,此函數的內部就是accept()系統調用了,函數返回產生了1個連接套接字,緊接著就是調用Acceptor中的回調函數newConnectionCallback_,那末這個回調是誰注冊的呢?肯定是誰具有Acceptor誰就負責初始化Acceptor中的newConnectionCallback_回調嘍!那末就是TcpServer負責注冊!在進行TcpServer初始化時調用Acceptor中的setNewConnectionCallback()函數將newConnection賦值給newConnectionCallback_。也就是說,在Acceptor中1旦accept()系統調用成功返回就立馬調用newConnection函數。
到目前為止,遺留下了以下幾個問題:
1、 Acceptor中的handleRead()函數是甚么時候被調用的!
2、 newConnecion雖然說屬于TcpServer,但是newConnection函數的作用是創建了1個類!這個類的作用也是舉足輕重!
接下來介紹下由TcpServer引出的Acceptor類:
首先這個類是屬于內部類。既然這個類是管理監聽套接字的,那末這個監聽套接字的生命周期就是由Acceptor類來管理。這個套接字在Acceptor就是Socket,同時也有1個EventLoop指針,表明這個Acceptor屬于某1個EventLoop(由于Acceptor依賴于某1個TcpSever,同時TcpServe和EventLoop是有依賴關系的)。同時還有1個newConnectionCallback_函數,這個函數是在TcpServer初始化的時候被賦值的。Listening_表示當前這個監聽套接字的狀態,idleFd_是1個輸出毛病的描寫符。這里還有1個新的類―Channel!這個類在全部庫中起著橋接的作用,全部這個類將有些東西單獨提取,是的其他各個類的功能更加單1,關于這個類的介紹不在這里,畢竟Acceptor類是1個內部類,如果這個1個龐大的類由內部類引出,顯得不夠重視!呵呵!這里暫時雪藏Channel類!
關于Acceptor類的接口,只有很少的3個:
其中1個是setNewConnectionCallback,由于Acceptor類屬于TcpServer類,所以調用合格函數的肯定是屬于Acceptor的所有者,也就是TcpServer類,這個函數在TcpServer的構造函數中被調用,將newConnectionCallback_函數賦值為newConnection,已說過了,有點