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

1、描述

acl 工程是一個跨平臺(支持LINUX,WIN32,Solaris,MacOS,FreeBSD)的網絡通訊庫及服務器編程框架,同時提供更多的實用功能 庫。經過該庫,用戶能夠很是容易地編寫支持多種模式(多線程、多進程、非阻塞、觸發器、UDP方式)的服務器程序,WEB 應用程序,數據庫應用程序。此外,該庫還提供了常見應用的客戶端通訊庫(如:HTTP、SMTP、ICMP、memcache、beanstalk),常 見流式編解碼庫:XML/JSON/MIME/BASE64/UUCODE/QPCODE/RFC2047 等。mysql

1.一、庫組成

本工程主要包含 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。數據庫

1.二、功能模塊組成

1.2.一、網絡通訊庫

  • 流處理模塊(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 客戶端通訊庫,該通訊庫支持鏈接池方式。

1.2.二、網絡 IO 事件引擎

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

1.2.三、網絡服務器框架

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

  • 1 多進程模型:一個鏈接一個進程,這種模型的優勢是編程簡單、安全穩定,缺點是併發度不高;

  • 2 多進程多線程模型:每一個子進程是由線程池中的一組線程處理全部的客戶端鏈接,採用 IO 事件觸發方式,只有當鏈接有數據可讀時纔會將鏈接與一個線程進行綁定,線程處理完後當即歸還給線程池,這種模型的最大優勢是能夠用少許的線程即可以處理大 量的客戶端鏈接,並且編程比較簡單(相對於非阻塞模型);

  • 3 多進程非阻塞模型:每一個子進程是由一個單獨的非阻塞線程組成,該線程採用徹底非阻塞 IO 方式處理外來的大量客戶端鏈接(相似於 nginx/squid/ircd),該模型的優勢是處理效率高佔用資源少,能夠處理大量客戶端鏈接,缺點是編程比較複雜;

  • 4 UDP 通訊模型:該模型主要爲了支持 UDP 網絡過程而增長的服務模型;

  • 5 解發器模型:該模型的實例主要用來處理一些定時任務的後臺服務過程(相似於系統的 crontab)。

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

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 服務器框架中多進程多線程服務模型中)。

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、平臺支持及編譯

整個工程目前支持 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。  

3、項目資料

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

相關文章
相關標籤/搜索