acl 3.0.14 版本 (項目主頁:https://sourceforge.net/projects/acl/,技術文章主頁:http://zsxxsz.iteye.com/)) 發佈了,acl 是 one Advanced C/C++ library 的簡稱,主要包括網絡通訊庫以及服務器框架庫等功能,支持 Linux/Windows/Solaris/FreeBsd/MacOS 平臺;整個 acl 項目主要包含三個函數庫:lib_acl(純C開發的基礎庫,主要包含網絡通訊及服務器編程框架以及其它豐富的功能)、lib_protocol(包含 HTTP/PING/SMTP 通訊協議的C語言實現)、lib_acl_cpp(基於 lib_acl 及 lib_protocol 兩個C庫,提供了更爲強大的編程接口及豐富的功能類);本次 acl 升級除了一些 bug 修復外,主要優化了 ACL 中的網絡服務器框架及網絡通訊庫的性能,此外,修復了一些在 solaris(x86) 上的一些不兼容性問題。node
acl 包括如下豐富的經常使用函數庫:linux
一、常見網絡應用庫: SMTP 客戶端庫/PING 庫/memcache 客戶端庫/handlersocket 客戶端庫/beanstalk 客戶端庫git
二、HTTP 網絡庫:HTTP 客戶端/服務端庫,C++版 HttpServlet 類,HTTP COOKIE/HTTP SESSION 等github
三、郵件解析庫:mime解析庫/RFC2047/RFC2048/mime base64/mime qp/mime uucode 等數據庫
四、網絡通訊庫:阻塞/非阻塞網絡 IO 庫(其中 lib_acl_cpp 庫經過嵌入 polarssl 而具有了 SSL 的能力)編程
五、服務器框架:包括進程池模式、線程池模式、非阻塞模式、UDP通訊模式及觸發器模式json
六、事件引擎:支持 select、poll(for unix)、epoll(for linux)、kqueue(for bsd)、devpoll(for solaris)、iocp(for win32)、win32 窗口消息(for win32)事件引擎安全
七、通用鏈接池庫:高效的鏈接池基礎類庫,支持豐富的功能性能優化
八、數據庫客戶端庫:對原生的數據庫客戶端庫進行了二次封裝,使編程更爲簡易,功能更爲豐富服務器
九、xml/json 流式解析庫:區別於網上其它已有的 xml/json 解析庫,acl 中的 xml/json 解析庫採用有限狀態機方式解析數據,處理方式更爲靈活
1、基礎 C 庫:lib_acl
.新特性: acl_json.c 增長了 acl_json_node_duplicate 用於複製一個 JSON 結點對象到一個新的 JSON 結點中;增長了 acl_json_create 用於根據一個 JSON 結點建立一個徹底的 JSON 對象
.新特性: acl_json_util.c 增長了 acl_json_node_build 用於根據一個 JSON 結點生成 JSON 字符串
.性能優化: acl_vstream.c,__sys_read 函數中當流的 sys_read_ready 爲 1 時,則不會調用系統 API select 判斷超時過程,從而減小一次系統調用,由於 sys_read_ready 標誌位會在事件模塊(event_xxx) 中被設置
.性能優化: acl_aio_server.c, acl_ioctl_server.c 服務器模塊參加了控制參數:master_status_notify,當啓動多個子進程時,該參數決定是否向acl_master 主進程彙報子進程的狀態,當 master_prefork 預啓動參數打開且該值 > 1 時,將 master_status_notify 設置爲 0,則子進程再也不向 acl_master 主進程彙報狀態,有助於減小 acl_master 主進程的負載
.性能優化: acl_vstream.c, 在 acl_vstream_readn 中,爲減小 read 次數,當輸入緩衝區較小時,則自動啓用雙緩衝讀方式
.問題修復: acl_json_parse.c,json_val() 函數中沒有針對轉義內容作特殊處理
問題修復: acl_vstream.c,在 acl_vstream_ctl 函數中,當控制參數爲 ACL_VSTREAM_CTL_PATH 時,對 stream->addr_peer 的賦值有問題(此 bug 由高版本的 gcc4.8.2 檢測出)
.編譯: Makefile 支持 solaris 編譯
.其它: 去掉了 event 目錄下的 events_kernel2.c 及 events_kernel3.c
.其它: acl_msg.c,在函數 acl_last_serror() 中分配的線程局部變量在主線程中沒法被正常釋放,會致使 valgrind 報錯
2、網絡應用協議庫:lib_protocol
.問題修復: http_chat_sync.c,在函數 http_res_body_get_sync 中,當爲 chunked 傳輸方式時,須要設置 ctx->chunk.chunk_oper = CHUNK_OPER_HEAD
.編譯: Makefile 支持 solaris 編譯
.其它: http_hdr_res.c/http_hdr_req.c,內部的線程局部變量沒法在主線程中釋放,會致使 valgrind 報警告
3、功能豐富的C++庫:lib_acl_cpp
.新特性: 新增長 event 模塊,將 master_timer 定時器類更名爲 event_timer 類放於 event 模塊中
.新特性: 在基類 master_base 中添加了方法 proc_set_timer 用於添加進程級別的定時器,(同時移除了 master_threads 子類中的 proc_set_timer 方法),這樣 master_base 的全部子類 (master_threads, master_aio, master_proc, master_udp, master_trigger) 均可以添加進程級別的定時器
.新特性: master 模塊增長了定時器類 master_timer
.新特性: json 類增長了如下功能函數:
a) 構造函數 json(const json_node&),能夠根據一個 json 對象的某一個 json 結點建立一個新的 json 對象
b) duplicate_node 根據一個 json 對象的某個 json 結點複製一個新的 json 結點
c) to_string 新的將 json 對象轉換爲字符串的函數
.新特性: json_node 類增長了如下功能函數:
a) to_string 根據 json 結點生成 json 字符串的函數
b) set_tag 用來替換標籤名
c) set_text 當 json 結點爲葉結點時用來替換標籤值
.新特性: http_header 類豐富了 set_url 及請求構造函數的參數類型,容許 URL 參數中含有請求參數,且內部會自動解析 url 中的主機名及參數
.新特性: http_header 類添加了請求參數添加方法:add_int 及 add_format
.新特性: http_header add_param 容許參數值爲空指針或空串
.新特性: http_header::set_host 僅是將主機字符串添加至成員變量 host_ 中
.新特性: http_header::set_url 中容許添加相似於 http://www.test.com 的 url(即末尾能夠沒有 '/')
.新特性: http_client 類增長了 chunked 傳輸方式;
.新特性: http_request 類增長流式寫函數:write_head/write_body;
.新特性: http_response 類增長了流式寫數據方式
.新特性: HttpServletRequest 類增長了幾個獲取 HTTP 請求頭參數的方法
.新特性: http_utils::get_addr 的 url 參數既能夠是 HTTP 也能夠是 HTTPS
.新特性: master_threads 模板支持新的定時器
.問題修復: connect_pool::put 在歸還鏈接給鏈接池時,爲了讓過時鏈接儘快回收,須要調用 push_front,原來調用了 push_back
.問題修復: http_header.cpp,http_header::date_format 在 WIN32 編譯出錯
.問題修復: json.cpp, json::getElementsByTags() 內部未對空指針作判斷
.問題修復: http_header.cpp, http_header::date_format 在 UNIX 平臺下 gmtime 是線程不安全的,因此須要使用 gmtime_r
.問題修復: http_download.cpp 的構造函數中調用 ACL_SAFE_STRNCPY 時第三個參數給出錯誤的尺寸大小(此 bug 由高版本的 gcc4.8.2 檢測出)
.問題修復: Makefile 支持 solaris(x86) 編譯
.新增示例: samples/json2, 用於測試級聯提取數據的例子
.新增示例: samples/ 目錄下新增長了 json 測試用例 json3/json4
.示例: samples/master_udp_threads: 該例子中的線程局部變量的靜態用法 __thread 沒法支持 solaris,改成動態方式使用線程局部變量方式
.註釋: 修正 connect_manager::init 原來錯誤的參數格式描述
.註釋: 消除了幾個頭文件中由 doxygen 檢測出的錯誤註釋
.其它: stream 模塊的異步流部分,將 aio_timer_callback 等類聲明從 aio_handle 類中移除成爲獨立的類
.其它: 調整類 http_client 中的兩個函數 get_respond_head 和 get_request_head 的返回值限制,去掉 const 限定詞
參考連接:
技術博客:http://zsxxsz.iteye.com/
download:http://sourceforge.net/projects/acl/
svn:svn checkout svn://svn.code.sf.net/p/acl/code/trunk acl-code
github:https://github.com/zhengshuxin/acl