acl project是一個跨平臺(支持LINUX,WIN32,Solaris,MacOS,FreeBSD)的網絡通訊庫及server編程框架,同一時候提供不少其它的有用功能庫。經過該庫,用戶可以很easy地編寫支持多種模式(多線程、多進程、非堵塞、觸發器、UDP方式)的server程序,WEB 應用程序,數據庫應用程序。此外,該庫還提供了常見應用的client通訊庫(如:HTTP、SMTP、ICMP、memcache、beanstalk),常見流式編解碼庫:XML/JSON/MIME/BASE64/UUCODE/QPCODE/RFC2047 etc。mysql
本project主要包括 5 個庫及大量演示樣例。5 個庫的說明例如如下:nginx
15 得到網絡流的本地地址及遠程地址git
網絡操做模塊:該模塊主要支持網絡服務端監聽(支持 TCP/UDP/UNIX 域套接口)、網絡client鏈接(支持 TCP/UNIX 域套接口)、DNS 域名查詢及結果緩存(支持調用系統 gethostbyname 函數和直接發送 DNS 協議兩種方式)、套接口(socket)操做及取本機網卡等功能。github
非堵塞網絡流:支持非堵塞方式鏈接、讀(按行讀,規定長度讀)、寫(寫行,寫規定長度,寫一組數據)等操做。算法
常見網絡應用協議庫(lib_protocol/lib_acl_cpp):主要支持常見網絡應用協議,諸如:HTTP、SMTP、ICMP,當中 HTTP、ICMP 兩個模塊實現了堵塞、非堵塞兩種通訊方式;此外,HTTP 協議在C++版的 lib_acl_cpp 中還支持服務端、client兩種通訊方式,看成爲服務端使用時,支持相似於 JAVA HttpServlet 的接口使用方式,看成爲client方式使用時,支持鏈接池與集羣管理方式,該模塊同一時候支持 cookie、session、HTTP MIME 文件上傳、分塊傳輸、字符集本身主動轉換、本身主動解壓縮、斷點續傳等豐富的功能。sql
常見網絡通訊庫:支持 memcached、beanstalk、handler socket client通訊庫,該通訊庫支持鏈接池方式。數據庫
支持 select(UNIX/LINUX/WIN32)、poll(UNIX/LINUX)、epoll(LINUX)、kqueue(BSD)、devpoll(solaris)、iocp(WIN32)、窗體消息(WIN32) 等系統事件引擎,同一時候支持 Reactor 及 Proactor 兩種編程模型。編程
該模塊是 acl 中最爲重要的模塊,提供了server編程中常用的基礎設施,該server框架來源於著名的 Postfix,在其基礎上進行了諸多擴展,眼下已經支持的主要服務模型有:json
server框架中的子進程有用採用半駐留服務模型,支持子進程預啓動機制、最大最小進程數控制、子進程異常報警、單一進程監聽多個地址(可同一時候監聽TCP/UDP套接字以及 UNIX 域套接字)、子進程安全控制、日誌輸出至 syslog-ng、多進程TCP鏈接均勻化;採用配置文件驅動方式,每個服務一個配置文件,方便進程管理及服務進程在線升級。ubuntu
該模塊提供了常見的哈希表(及多種哈希算法)、動態數組、雙向鏈表、平衡二叉樹、隊列、二分塊查找樹、256 叉匹配樹等數組結構;提供了統一的數據結構遍歷方法(採用 acl_foreach)。
該模塊提供三種內存池模型:
支持字符串匹配查找、前(後)向比較、字符串切割、字符串大寫和小寫轉換、H2B/B2H 轉換、URL 編碼/解碼等功能。
支持多級文件夾建立、多級文件夾掃描、文件句柄緩存等功能,同一時候在處理多級文件夾採用循環方式,避免了遞歸方式時可能的棧溢出的隱患。
支持讀 name=value 形式的配置文件,value 較長時可以使用反斜槓()折行,採用配置表方式提取配置文件裏的配置項。
提供了跨平臺的支持 Posix 規範的線程接口(支持WIN32);線程池模塊經過多種措施最大程度地下降線程任務分配時的鎖衝突(用在 acl server框架中多進程多線程服務模型中)。
採取 KEY/VALUE 分塊存儲方式,因爲 KEY 限定爲數字類型,僅僅需內存計算即可算出 KEY 的位置,KEY 中存放了 VALUE 的位置,因此對於不論什麼的數據查詢僅僅需兩次磁盤定位。(本人在和訊作流量統計存儲時,使用該種方式替代了BSD、TC 等採用B樹的 K-V 存儲)
該模塊包含 xml、json、rfc204七、mime、base6四、uucode、qpcode、charset 等編解碼庫,這些解碼庫均採用流式解析方式,適合於多種網絡 IO 模型(堵塞/非堵塞TCP、UDP)。
設計了統一的數據庫操做接口及鏈接池處理方式,眼下支持 sqlite/mysql。
支持多組文件夾隊列文件的建立、掃描、刪除等操做;常用於暫時文件隊列調度的服務程序中。
整個project眼下支持 Linux(AS4,5,6, CS4,5,6, ubuntu), Windows, MacOS, FreeBSD, Solaris。
當在 WIN32 環境下使用動態庫時有幾點需要注意:
github: https://github.com/zhengshuxin/acl
sourceforge:http://sourceforge.net/projects/acl/
相關技術博客:http://zsxxsz.iteye.com/
QQ 羣: 242722074
acl project有大量的測試用例(近200個):https://github.com/zhengshuxin/acl/blob/master/SAMPLES.md
此外,還幾個有用的工具:
一、server程序生成嚮導:https://github.com/zhengshuxin/acl/tree/master/app/wizard,使用該工具,可以高速地建立網絡server程序(甚至於 HTTP WEB server程序)
二、全局惟一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
二、異步 IO 類繼承圖
三、IO 流繼承圖
四、接收上傳文件的 CGI 程序:
五、文件下載client程序:
六、網頁下載程序: