acl 工程是一個跨平臺(支持LINUX,WIN32,Solaris,MacOS,FreeBSD)的網絡通訊庫及服務器編程框架,同時提供更多的實用功能 庫。經過該庫,用戶能夠很是容易地編寫支持多種模式(多線程、多進程、非阻塞、觸發器、UDP方式)的服務器程序,WEB 應用程序,數據庫應用程序。此外,該庫還提供了常見應用的客戶端通訊庫(如:HTTP、SMTP、ICMP、memcache、beanstalk),常 見流式編解碼庫:XML/JSON/MIME/BASE64/UUCODE/QPCODE/RFC2047 等。mysql
本工程主要包含 5 個庫及大量示例。5 個庫的說明以下:nginx
1) lib_acl: 該庫是最基礎的庫,其它 4 個庫均依賴於該庫; 該庫以 C 語言實現。git
2) lib_protocol: 該庫主要實現了 http 協議及 icmp/ping 協議; 該庫以 C 語言實現。github
3) lib_acl_cpp: 該庫用 C++ 語言封裝了 lib_acl/lib_protocol 兩個庫,同時增長了一些其它有價值的功能應用。算法
4) lib_dict: 該庫主要實現了 KEY-VALUE 的字典式存儲庫,該庫另外還依賴於 BDB, CDB 以及 tokyocabinet 庫。sql
5) lib_tls: 該庫封裝了 openssl 庫,使 lib_acl 的通訊模式能夠支持 ssl。數據庫
流處理模塊(ACL_VSTREAM): 該模塊是整個 acl 網絡通訊最基礎的流式通訊模塊,不只支持網絡流,同時還支持文件流,主要支持:編程
1 按行讀數據,兼容 win32 下的 \r\n,同時兼容 UNIX 下的 \n 的結束符json
2 按行讀數據但要求自動去掉尾部的 \n 或 \r\nubuntu
3 以字符串爲分隔符讀取數據
4 讀規定長度的數據
5 嘗試性讀一行數據或嘗試性讀規定長度數據
6 探測網絡 IO 狀態
7 寫入一行數據
8 按格式符寫入數據,相似於 fprintf
9 文件流定位操做,相似於 fseek
10 一次性寫入一組數據,相似於 unix 下的 writev
11 將文件截短,相似於 ftrunk
12 獲取文件大小
13 得到當前文件流指針位置,相似於 ftell
14 得到文件尺寸
15 得到網絡流的本地地址及遠程地址
網絡操做模塊:該模塊主要支持網絡服務端監聽(支持 TCP/UDP/UNIX 域套接口)、網絡客戶端鏈接(支持 TCP/UNIX 域套接口)、DNS 域名查詢及結果緩存(支持調用系統 gethostbyname 函數和直接發送 DNS 協議兩種方式)、套接口(socket)操做及取本機網卡等功能。
非阻塞網絡流:支持非阻塞方式鏈接、讀(按行讀,規定長度讀)、寫(寫行,寫規定長度,寫一組數據)等操做。
常見網絡應用協議庫(lib_protocol/lib_acl_cpp): 主要支持常見網絡應用協議,諸如:HTTP、SMTP、ICMP,其中 HTTP、ICMP 兩個模塊實現了阻塞、非阻塞兩種通訊方式;此外,HTTP 協議在C++版的 lib_acl_cpp 中還支持服務端、客戶端兩種通訊方式,看成爲服務端使用時,支持相似於 JAVA HttpServlet 的接口使用方式,看成爲客戶端方式使用時,支持鏈接池與集羣管理方式,該模塊同時支持 cookie、session、HTTP MIME 文件上傳、分塊傳輸、字符集自動轉換、自動解壓縮、斷點續傳等豐富的功能。
常見網絡通訊庫: 支持 memcached、beanstalk、handler socket 客戶端通訊庫,該通訊庫支持鏈接池方式。
支持 select(UNIX/LINUX/WIN32)、poll(UNIX/LINUX)、epoll(LINUX)、kqueue(BSD)、 devpoll(solaris)、iocp(WIN32)、窗口消息(WIN32) 等系統事件引擎,同時支持 Reactor 及 Proactor 兩種編程模型。
該模塊是 acl 中最爲重要的模塊,提供了服務器編程中經常使用的基礎設施,該服務器框架來源於著名的 Postfix,在其基礎上進行了諸多擴展,目前已經支持的主要服務模型有:
1 多進程模型:一個鏈接一個進程,這種模型的優勢是編程簡單、安全穩定,缺點是併發度不高;
2 多進程多線程模型:每一個子進程是由線程池中的一組線程處理全部的客戶端鏈接,採用 IO 事件觸發方式,只有當鏈接有數據可讀時纔會將鏈接與一個線程進行綁定,線程處理完後當即歸還給線程池,這種模型的最大優勢是能夠用少許的線程即可以處理大 量的客戶端鏈接,並且編程比較簡單(相對於非阻塞模型);
3 多進程非阻塞模型:每一個子進程是由一個單獨的非阻塞線程組成,該線程採用徹底非阻塞 IO 方式處理外來的大量客戶端鏈接(相似於 nginx/squid/ircd),該模型的優勢是處理效率高佔用資源少,能夠處理大量客戶端鏈接,缺點是編程比較複雜;
4 UDP 通訊模型:該模型主要爲了支持 UDP 網絡過程而增長的服務模型;
5 解發器模型:該模型的實例主要用來處理一些定時任務的後臺服務過程(相似於系統的 crontab)。
服務器框架中的子進程實用採用半駐留服務模型,支持子進程預啓動機制、最大最小進程數控制、子進程異常報警、單一進程監聽多個地址(可同 時監聽TCP/UDP套接字以及 UNIX 域套接字)、子進程安全控制、日誌輸出至 syslog-ng、多進程TCP鏈接均勻化;採用配置文件驅動方式,每一個服務一個配置文件,方便進程管理及服務進程在線升級。
該模塊提供了常見的哈希表(及多種哈希算法)、動態數組、雙向鏈表、平衡二叉樹、隊列、二分塊查找樹、256 叉匹配樹等數組結構;提供了統一的數據結構遍歷方法(採用 acl_foreach)。
該模塊提供三種內存池模型:
1 基本的內存方式:內部封裝了系統的 malloc/free API,提供了內存校驗等安全措施;該方式同時提供外部註冊接口,容許使用者註冊本身的內存分配模型;
2 內存片(slab) 方式:根據不一樣的尺寸大小分配多個定長內存鏈,能夠有效地減小內存碎片,大大提高內存分配效率;
3 內存鏈方式:將長度不一的小內存分配在一條內存頁上,能夠很是有效地使用內存,減小內存浪費。
支持字符串匹配查找、前(後)向比較、字符串分割、字符串大小寫轉換、H2B/B2H 轉換、URL 編碼/解碼等功能。
支持多級目錄建立、多級目錄掃描、文件句柄緩存等功能,同時在處理多級目錄採用循環方式,避免了遞歸方式時可能的棧溢出的隱患。
支持讀 name=value 形式的配置文件,value 較長時可使用反斜槓()折行,採用配置表方式提取配置文件中的配置項。
提供了跨平臺的支持 Posix 規範的線程接口(支持WIN32);線程池模塊經過多種措施最大程度地減小線程任務分配時的鎖衝突(用在 acl 服務器框架中多進程多線程服務模型中)。
採起 KEY/VALUE 分塊存儲方式,由於 KEY 限定爲數字類型,只需內存計算即可算出 KEY 的位置,KEY 中存放了 VALUE 的位置,因此對於任何的數據查詢只需兩次磁盤定位。(本人在和訊作流量統計存儲時,使用該種方式替代了BSD、TC 等採用B樹的 K-V 存儲)
該模塊包括 xml、json、rfc204七、mime、base6四、uucode、qpcode、charset 等編解碼庫,這些解碼庫均採用流式解析方式,適合於多種網絡 IO 模型(阻塞/非阻塞TCP、UDP)。
設計了統一的數據庫操做接口及鏈接池處理方式,目前支持 sqlite/mysql。
支持多組目錄隊列文件的建立、掃描、刪除等操做;經常使用於臨時文件隊列調度的服務程序中。
整個工程目前支持 Linux(AS4,5,6, CS4,5,6, ubuntu), Windows, MacOS, FreeBSD, Solaris。
Linux/UNIX: 編譯器爲 gcc,直接在終端命令行方式下分別進入 lib_acl/lib_protocol/lib_acl_cpp/lib_dict/lib_tls 目錄下,運行 make 命令便可。
Windows: 能夠用 VC2003/VC2008/VC2010/VC2012 進行編譯。(若是須要用 VC6/VC2005 編譯,能夠參考 VC2003 的編譯條件)。
當在 WIN32 環境下使用動態庫時有幾點須要注意:
使用 lib_acl 的動態庫時,須要在用戶的工程預約義: ACL_DLL;
使用 lib_protocol 動態庫中的 HTTP 庫或 ICMP 庫時,須要在工程中預約義 HTTP_DLL 或 ICMP_DLL;
使用 lib_acl_cpp 的動態庫時,須要在工程中預約義 ACL_CPP_DLL,若是您使用用 VC2003 編譯環境則還須要預約義 VC2003;
使用 lib_dict 的動態庫時,須要在工程中預約義 DICT_DLL;
使用 lib_tls 的動態庫時,須要在工程中預約義 TLS_DLL。
github: https://github.com/zhengshuxin/acl
sourceforge:http://sourceforge.net/projects/acl/
相關技術博客:http://zsxxsz.iteye.com/
acl 工程有大量的測試用例(近200個):https://github.com/zhengshuxin/acl/blob/master/SAMPLES.md
此外,還幾個實用的工具:
一、服務器程序生成嚮導:https://github.com/zhengshuxin/acl/tree/master/app/wizard,使用該工具,能夠快速地建立網絡服務器程序(甚至於 HTTP WEB 服務器程序)
二、全局惟一ID產生器:https://github.com/zhengshuxin/acl/tree/master/app/gid
三、網絡狀態監控工具(WIN32):https://github.com/zhengshuxin/acl/tree/master/app/net_tools
四、TCP 鏈接分配器:https://github.com/zhengshuxin/acl/tree/master/app/master_dispatch
五、字符集轉換器:https://github.com/zhengshuxin/acl/tree/master/app/jencode