對asio庫做個特別記錄,網上大部分有關網絡庫的文章中提到的asio都是boost版本的,但其實有一個獨立於boost的asio庫,與boost無關,內容用法都一樣,可以非常簡單的加入到項目中進行開發。
這里是下載鏈接:
非boost庫版的asio-CSDN下載 http://download.csdn.net/download/dreamhuijie/9994081
使用非常簡單:
使用方法: 1.下載解壓asio-1.10.8庫。這個是獨立於boost的版本。 2.項目屬性路徑中包含路徑添加asio-1.10.8的include目錄 3.項目屬性預處理器定義添加ASIO_STANDALONE 4.開始編程:#include <asio.hpp>
其他可能需要設置的地方:
1.設置工程屬性"常規/字符集"設置為使用多字節字符集
2. c++/預處理器/預處理器定義"中加入宏定義 : _WIN32_WINNT 0x0A00 //聲明操作系統為WIN10
下面附上網址,可以下載庫,學習文檔
(1)ACE
http://www.cs.wustl.edu/~schmidt/ACE.html
(2)Asio
下面的內容轉載自:
開源C/C++網絡庫比較 - CSDN博客 http://blog.csdn.net/langeldep/article/details/6976120
在開源的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這個庫。
參考:
開源免費的C/C++網絡庫(c/c++ sockets library) - findumars - 博客園 https://www.cnblogs.com/findumars/p/5859634.html