潤小云解讀鴻蒙OS系列(二):分佈式軟總線之trans_service

    trans_service模塊依賴於系統OS提供的網絡socket服務,向認證模塊提供認證通道管理和認證數據的收發;向業務模塊提供session管理和基於session的數據收發功能,而且經過GCM模塊的加密功能提供收發報文的加解密保護。網絡

 

  • 初始化的時機

在分佈式軟總線的設計中,trans_service模塊是在authmanager模塊中被初始化的,而authmanager模塊又被discovery模塊初始化,所以設備在向外發佈本設備信息的過程當中,即完成了這三個相互關聯模塊的初始化動做。session

authmanager模塊中存在StartBus()函數,其中,StartListener()函數負責爲認證模塊提供通道完成初始化,StartSession()函數負責初始化業務的session管理:socket

   

認證通訊與業務session的實現原理相似,本文中咱們以簡單一些的認證通訊代碼爲例子,說明典型的處理流程。分佈式

 

 

  • 初始化入口 – StartListener

StartListener()函數的底層存在對應不一樣版本平臺的適配函數,這印證了鴻蒙OS各部分解耦的模塊化設計思想,針對不一樣的硬件設備,組合成最適合該設備的OS。好比建立線程時採用了統一的static void WaitProcess(void)函數,而其內部封裝了不一樣底層API的適配代碼。模塊化

 

StartListener()調用InitListenFd()函數完成監聽TCP socket的建立和監聽,其中IP地址和端口號由上層調用者指定。函數

 

如上文所述,AuthCreate()在不一樣平臺上會有不一樣的實現,在LITEOS_A和Linux平臺上, AuthCreate()會調用兼容POSIX的pthread_create()完成線程的建立,線程的入口函數爲static void WaitProcess(void)。加密

 

 

 

 

  • 監聽新鏈接和數據 – WaitProcess

WaitProcess()使用忙等方式,調用select()來監聽listenFd和數據g_dataFd的信息,若是監聽到有數據可讀,則進入ProcessAuthData來處理。spa

若是發現g_dataFd有異常信息,則將其關閉。其中g_dataFd是由listenFd監聽到鏈接時建立的socket。
 線程

 

  • 處理新鏈接和數據 - ProcessAuthData

不管是新鏈接請求,仍是已有鏈接中有數據到來,均會進入本函數。設計

函數經過FD_ISSET()判斷是不是listenFd上存在消息,若是是,則說明當前存在新的鏈接,這時調用accept()完成連接建立,新建立的socket的fd被存儲在g_dataFd中,同時調用g_callback->onConnectEvent通知認證模塊有新的鏈接事件發生,並將新建立的fd和client的IP地址告知認證模塊。

與此同時,建立g_dataFd時候須要刷新g_maxFd,以保證在WaitProcess()中的下一次select()操做時中,會監聽到g_dataFd上的事件。

若是FD_ISSET()判斷出g_dataFd上存在消息,則說明已完成握手的鏈接向本節點發送了數據,這時函數回調g_callback->onDataEvent(),把控制權返回給調用者,以處理接收到的數據。

 

  • 回調函數的處理

trans_service模塊的使用者設置的回調函數將在存在新鏈接、和新數據時被調用,好比認證模塊經過如下函數完成認證動做:OnConnectEvent()函數中完成對新鏈接的處理, OnDataEvent()函數中完成對新數據的處理。

  • 業務的session管理

該部分代碼負責業務的數據通訊,節點經過名稱進行通訊,對外隱藏了端口信息,代碼的實現原理與上面的認證通訊相似,針對業務需求增長了如多路通訊等方面的實現,這裏再也不詳細分析。

相關文章
相關標籤/搜索