跨平臺網絡通訊與server編程框架庫(acl庫)介紹

1、描寫敘述

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

1.一、庫組成

本project主要包括 5 個庫及大量演示樣例。5 個庫的說明例如如下:nginx

  • 1) lib_acl: 該庫是最基礎的庫,其餘 4 個庫均依賴於該庫; 該庫以 C 語言實現。
  • 2) lib_protocol: 該庫主要實現了 http 協議及 icmp/ping 協議; 該庫以 C 語言實現。
  • 3) lib_acl_cpp: 該庫用 C++ 語言封裝了 lib_acl/lib_protocol 兩個庫,同一時候添加了一些其餘有價值的功能應用。
  • 4) lib_dict: 該庫主要實現了 KEY-VALUE 的字典式存儲庫,該庫另外還依賴於 BDB, CDB 以及 tokyocabinet 庫。
  • 5) lib_tls: 該庫封裝了 openssl 庫,使 lib_acl 的通訊模式可以支持 ssl。

1.二、功能模塊組成

1.2.一、網絡通訊庫

  • 流處理模塊(ACL_VSTREAM): 該模塊是整個 acl 網絡通訊最基礎的流式通訊模塊,不只支持網絡流,同一時候還支持文件流,主要支持:
  • 1 按行讀數據,兼容 win32 下的 \r\n,同一時候兼容 UNIX 下的 \n 的結束符
  • 2 按行讀數據但要求本身主動去掉尾部的 \n 或 \r\n
  • 3 以字符串爲分隔符讀取數據
  • 4 讀規定長度的數據
  • 5 嘗試性讀一行數據或嘗試性讀規定長度數據
  • 6 探測網絡 IO 狀態
  • 7 寫入一行數據
  • 8 按格式符寫入數據,相似於 fprintf
  • 9 文件流定位操做,相似於 fseek
  • 10 一次性寫入一組數據,相似於 unix 下的 writev
  • 11 將文件截短,相似於 ftrunk
  • 12 獲取文件大小
  • 13 得到當前文件流指針位置,相似於 ftell
  • 14 得到文件尺寸
  • 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通訊庫,該通訊庫支持鏈接池方式。數據庫

1.2.二、網絡 IO 事件引擎

支持 select(UNIX/LINUX/WIN32)、poll(UNIX/LINUX)、epoll(LINUX)、kqueue(BSD)、devpoll(solaris)、iocp(WIN32)、窗體消息(WIN32) 等系統事件引擎,同一時候支持 Reactor 及 Proactor 兩種編程模型。編程

1.2.三、網絡server框架

該模塊是 acl 中最爲重要的模塊,提供了server編程中常用的基礎設施,該server框架來源於著名的 Postfix,在其基礎上進行了諸多擴展,眼下已經支持的主要服務模型有:json

  • 1 多進程模型:一個鏈接一個進程,這樣的模型的長處是編程簡單、安全穩定,缺點是併發度不高;
  • 2 多進程多線程模型:每個子進程是由線程池中的一組線程處理所有的client鏈接,採用 IO 事件觸發方式,僅僅有當鏈接有數據可讀時纔會將鏈接與一個線程進行綁定,線程處理完後立刻歸還給線程池,這樣的模型的最大長處是可以用少許的線程便可以處理大量的client鏈接,而且編程比較簡單(相對於非堵塞模型);
  • 3 多進程非堵塞模型:每個子進程是由一個單獨的非堵塞線程組成,該線程採用全然非堵塞 IO 方式處理外來的大量client鏈接(相似於 nginx/squid/ircd),該模型的長處是處理效率高佔用資源少,可以處理大量client鏈接,缺點是編程比較複雜;
  • 4 UDP 通訊模型:該模型主要爲了支持 UDP 網絡過程而添加的服務模型;
  • 5 解發器模型:該模型的實例主要用來處理一些定時任務的後臺服務過程(相似於系統的 crontab)。

server框架中的子進程有用採用半駐留服務模型,支持子進程預啓動機制、最大最小進程數控制、子進程異常報警、單一進程監聽多個地址(可同一時候監聽TCP/UDP套接字以及 UNIX 域套接字)、子進程安全控制、日誌輸出至 syslog-ng、多進程TCP鏈接均勻化;採用配置文件驅動方式,每個服務一個配置文件,方便進程管理及服務進程在線升級。ubuntu

1.2.四、常用數據結構模塊

該模塊提供了常見的哈希表(及多種哈希算法)、動態數組、雙向鏈表、平衡二叉樹、隊列、二分塊查找樹、256 叉匹配樹等數組結構;提供了統一的數據結構遍歷方法(採用 acl_foreach)。

1.2.五、 內存操做模塊

該模塊提供三種內存池模型:

  • 1 主要的內存方式:內部封裝了系統的 malloc/free API,提供了內存校驗等安全措施;該方式同一時候提供外部註冊接口,贊成使用者註冊本身的內存分配模型;
  • 2 內存片(slab) 方式:依據不一樣的尺寸大小分配多個定長內存鏈,可以有效地下降內存碎片,大大提高內存分配效率;
  • 3 內存鏈方式:將長度不一的小內存分配在一條內存頁上,可以頗有效地使用內存,下降內存浪費。

1.2.六、常用字符串操做模塊

支持字符串匹配查找、前(後)向比較、字符串切割、字符串大寫和小寫轉換、H2B/B2H 轉換、URL 編碼/解碼等功能。

1.2.七、文件文件夾模塊

支持多級文件夾建立、多級文件夾掃描、文件句柄緩存等功能,同一時候在處理多級文件夾採用循環方式,避免了遞歸方式時可能的棧溢出的隱患。

1.2.八、讀配置文件模塊

支持讀 name=value 形式的配置文件,value 較長時可以使用反斜槓()折行,採用配置表方式提取配置文件裏的配置項。

1.2.九、線程及線程池模塊

提供了跨平臺的支持 Posix 規範的線程接口(支持WIN32);線程池模塊經過多種措施最大程度地下降線程任務分配時的鎖衝突(用在 acl server框架中多進程多線程服務模型中)。

1.2.十、數字鍵的 K-V 磁盤存儲模塊(zdb)

採取 KEY/VALUE 分塊存儲方式,因爲 KEY 限定爲數字類型,僅僅需內存計算即可算出 KEY 的位置,KEY 中存放了 VALUE 的位置,因此對於不論什麼的數據查詢僅僅需兩次磁盤定位。(本人在和訊作流量統計存儲時,使用該種方式替代了BSD、TC 等採用B樹的 K-V 存儲)

1.2.十一、流式解析庫

該模塊包含 xml、json、rfc204七、mime、base6四、uucode、qpcode、charset 等編解碼庫,這些解碼庫均採用流式解析方式,適合於多種網絡 IO 模型(堵塞/非堵塞TCP、UDP)。

1.2.十二、數據庫封裝庫

設計了統一的數據庫操做接口及鏈接池處理方式,眼下支持 sqlite/mysql。

1.2.1三、文件隊列處理庫

支持多組文件夾隊列文件的建立、掃描、刪除等操做;常用於暫時文件隊列調度的服務程序中。

2、平臺支持及編譯

整個project眼下支持 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 的動態庫時,需要在用戶的project提早定義: ACL_DLL;
  • 使用 lib_protocol 動態庫中的 HTTP 庫或 ICMP 庫時,需要在project中提早定義 HTTP_DLL 或 ICMP_DLL;
  • 使用 lib_acl_cpp 的動態庫時,需要在project中提早定義 ACL_CPP_DLL,假設您使用用 VC2003 編譯環境則還需要提早定義 VC2003;
  • 使用 lib_dict 的動態庫時,需要在project中提早定義 DICT_DLL;
  • 使用 lib_tls 的動態庫時,需要在project中提早定義 TLS_DLL。  

3、項目資料

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

4、圖例

一、類索引圖:



二、異步 IO 類繼承圖



三、IO 流繼承圖



四、接收上傳文件的 CGI 程序:



五、文件下載client程序:



六、網頁下載程序:

相關文章
相關標籤/搜索