幾個主要cpp開源網絡庫的比較

最近要作網絡方面的工作,主要的需求就是實現一個Reactor框架!所以花時間研究一下cpp可用的開源的網絡庫,在所有開源的cpp網絡庫中,常用的也就是ACE、libevent、l以及Boost.ASIO順帶一提我比較熟悉的libev!

首先說說ACE,第一印象就是“龐大”(20萬行的代碼),一大堆東西(memory pool、thread pool、定時器、recursive locks)應有盡有了!是一個大型的中間件解決方案。一堆的設計模式,多層構架,使用的時候要考慮好選擇哪一層來使用,更關鍵的是誇平臺,我前面I/O聚集和分離解決方案的文章中傳輸文件描述符的代碼就是參照這個裏面的代碼寫地。ACE用起來很象java,但是本不像業務層語言,如果真要用ACE我覺得就不要當作是一個網絡庫使用,而是一個開發框架(雖然比不上osgi);不然投入和產出比不高,學的太多用的太少! 

libev是一個c語言寫成的網絡庫,這個庫我在學校的時候就用過,它封裝了linux的epoll(所以可移植性就沒有了),代碼量少並且很簡潔,易究和學習原理,感覺沒有什麼實際的使用意義。(順帶一提epoll是在活躍鏈接少的情況下效率高,如果[活躍鏈接/總鏈接]大的情況下和select模型沒有什麼區別,所以epoll適合斷連接)。

libevent也是c語言實現的一個網絡庫,主要的支持*nix平臺,後面添加了對windows的ICOP的支持。由於ICOP是一個異步模型,與linux下的poll、epoll以及BSD和AIX的KQueue完全不一樣,順帶一提的是select模型可以誇linux,unix,windows。但是爲了性能大家都是用條件編譯,系統定義的宏可以參照這裏:http://sourceforge.net/apps/mediawiki/predef/index.php?title=Operating_Systems#AIX

Boost.ASIO這個一個異步I/O庫,誇平臺,其實算是封裝了socket的操作,簡化了socket程序開發(沒有什麼特殊要求建議大家使用這個)

一下就層次構架,設計模式和功能做一些區分:

層次構架:

前面說了ACE是多層次結構,ACE的底層是c風格的OS適配層(這裏你又看到了軟件行業的銀彈原則),中間層當然是cpp封裝的類,再上層是一些框架包括了(Acceptor, Connector, Reactor, Proator等等),最上層是一些框架上的服務,個人認爲ACE就是軟件中的藝術品,你可以享受到完美的代碼和設計思想。

Boost.ASIO與ACE的構架非常類似(個人覺得不是偶然),底層是OS的適配層,上一層是一些模板類,再上一層模板類的參數化(TCP/UDP),再上一層是服務(只有一種框架爲io_service)。

libevent在不同的操作系統下,做了多路複用模型的抽象,可以選擇使用不同的模型,通過事件函數提供服務。

從這裏看出來我把不同級別的庫都放在這裏比較,看上去好像沒有什麼可比性,但是這就是軟件開發包選擇的基礎吧。

設計模式:

ACE使用的設計模式很多,用得最多的應該是Proactor和Reactor。

ASIO提供Proactor框架。

libevent提供Reactor框架。

其實你稍微對這些技術有一些瞭解,你就可以猜出他們可能的實現。

功能:

ACE提供包含log, IPC, thread pool, memory pool, recursive locks,定時器,配置服務器等(你真是不應該只是把它當作網絡庫使用)。

Boost的ASIO相對來說比較簡單(因爲只提供socket操作),但是也提供簡單的線程操作。

libevent和libev也只是提供簡單的網絡封裝,你如果要上面ACE提到的那些東西都需要自己實現。


主要的信息來自官方的文檔,如果理解有誤請大家指正!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章