Zeroc ICE 源碼分析三 ICE的網絡通信

網絡通信架構

ICE的網絡通信的架構在 Pattern-Oriented Software Architecture (Vol.2)  一書中有詳細描述。主要採用了異步的網絡通信方式。如下圖所示:

其中Async Service Layer處理異步的連接,斷開,接受數據等請求。在Windows 版本的ICE中使用了ConnectEx(), AcceptEx()等異步接口。

在異步請求完成後Windows會將結果緩存在由操作系統管理的Queue 中, 上層通過GetQueuedCompletionStatus()獲得queue中的結果。

ICE使用了一個ThreadPool 不斷請求queue中的異步結果並處理。我想這就是ICE高效的異步網絡通信架構的核心。

異步消息處理

所有的異步處理請求者會調用 ThreadPool::_register(EventHandlerPtr *, ...) 註冊一個EventHandler 的callback。
在ThreadPool::run()方法中會調用 Selector::getNextHandler()從queue中獲取一個需要處理的消息後調用EventHandler::message()處理消息。
Selector::getNextHandler()中即調用了GetQueuedCompletionStatus()。
在ICE中如下三個類實現了EventHandler的接口。

連接


ICE的ConnectEx的調用請參見cpp/src/ICE/Network.cpp 的 doConnectAsync()函數。

收發數據

ICE 分別使用 Outgoing / OutgoingAsync 來同步 /  異步的發送數據。Outgoing 使用了Transceiver() 發送數據。接受數據會送到異步的queue中。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章