1. 程式人生 > >比較開源C/C++網路庫

比較開源C/C++網路庫

在開源的C/C++網路庫中, 常用的就那麼幾個,在業界知名度最高的, 應該是ACE了, 不過是個重量級的大傢伙, 輕量級的有libevent, libev, 還有 Boost的ASIO。


ACE是一個大型的中介軟體產品,程式碼20萬行左右,過於巨集大,一堆的設計模式,架構了一層又一層,使用的時候, 要根據情況,看你從那一層來進行使用。支援跨平臺。


Boost的ASIO是一個非同步IO庫,封裝了對Socket的常用操作,簡化了基於socket程式的開發。支援跨平臺。


libevent是一個C語言寫的網路庫, 官方主要支援的是類linux 作業系統, 最新的版本添加了對windows的IOCP的支援。由於IOCP是非同步IO,與linux下的POLL模型,EPOLL模型,還有freebsd的KQUEUE等這些同步模型在用法上完全不一致,所以使用方法也不一樣,就好比ACE中的Reactor和Proactor模式一樣, 使用起來需要轉變思路。如果對效能沒有特別的要求, 那麼使用libevent中的select模型來實現跨平臺的操作, select模型可以橫跨windows, linux, unix,solaris等系統。


libev是一個C語言寫的,只支援linux系統的庫,我以前研究的時候只封裝了EPOLL模型, 不知道現在的新版有沒有改進。使用方法類似libevent, 但是非常簡潔,程式碼量是最少的一個庫,也就幾千行程式碼。顯然這樣的程式碼跨平臺肯定是無法支援的了, 如果你只需要在linux下面執行,那用這個庫也是可以的。


ACE網路庫在使用中,一直對其中的記憶體管理搞得一頭霧水,分配的記憶體需要在哪裡釋放都不知道,ACE不愧是一個做研究用的庫, 可以說裡面的封裝把設計模式這本書中列出的模式都在程式碼裡面實現了一番,用起來感覺是在用java一樣,如果你想使用ACE作為你的網路庫, 千萬不要僅僅把它當成一個網路庫使用, 你要把它當成一個框架來使用,如果你只想用它的網路庫, 那大可不必用ACE, 因為它太龐大了,學習起來太費勁。但是你把它當成一個框架來用,你會感覺用的還真爽,該有的東西都有,比如執行緒池,記憶體池,定時器,遞迴鎖等,都很方便的。Boost的ASIO,在記憶體管理方面要直觀的多。下面簡單地與ACE做個比較。


1.層次架構:
ACE底層是C風格的OS適配層,上一層基於C++的wrap類,再上一層是一些框架(Accpetor, Connector,Reactor,Proactor等),最上一層是框架上服務。
Boost.ASIO與之類似,底層是OS的適配層,上一層一些模板類,再上一層模板類的引數化(TCP/UDP),再上一層是服務,它只有一種框架為io_service。
livevent在不同的作業系統下,做了多路複用模型的抽象,可以選擇使用不同的模型,通過事件函式提供服務。


2.涉及範圍:
ACE包含了日誌,IPC,執行緒池,共享記憶體,配置服務,遞迴鎖,定時器等。
ASIO只涉及到Socket,提供簡單的執行緒操作。
libevent只提供了簡單的網路API的封裝, 執行緒池, 記憶體池, 遞迴鎖等均需要自己實現。


3.設計模式:
ACE主要應用了Reactor,Proactor等。
 而ASIO主要應用了Proactor。
libevent為Reactor模式


4.執行緒排程:
ACE的Reactor是單執行緒排程,Proactor支援多執行緒排程。
ASIO支援單執行緒與多執行緒排程。
libevent的執行緒排程需要自己來註冊不同的事件控制代碼。


5.事件分派處理:
ACE主要是註冊handler類,當事件分派時,呼叫其handler的虛掛勾函式。實現ACE_Handler / ACE_Svc_Handler / ACE_Event_handler等類的虛擬函式。
ASIO是基於函式物件的hanlder事件分派。任何函式都可能成為hanlder,少了一堆虛表的維護,排程上優於ACE。
libevent基於註冊的事件回撥函式來實現事件分發。


6.釋出方式:
ACE是開源免費的,不依賴於第3方庫, 一般應用使用它時,以動態連結的方式釋出動態庫。
ASIO是開源免費的,依賴Boost,應用使用時只要include標頭檔案,不需動態庫。
libevent為開源免費的,一般編譯為靜態庫進行使用。


7.可移植性:
ACE支援多種平臺,可移植性不存在問題,據說socket程式設計在linux下有不少bugs。
ASIO支援多種平臺,可移植性不存在問題。
libevent主要支援linux平臺,freebsd平臺, 其他平臺下通過select模型進行支援, 效率不是太高。


8.開發難度:
基於ACE開發應用,對程式設計師要求比較高,要用好它,必須非常瞭解其框架。在其框架下開發,往往new出一個物件,不知在什麼地方釋放好。


基於ASIO開發應用,要求程式設計師熟悉函式物件,函式指標,熟悉boost庫中的boost::bind。記憶體管理控制方面。


基於libevent開發應用,相對容易, 具體大家可以參考memcached這個開源的應用,裡面使用了libevent這個庫。