acl 3.0.22 版本釋出了,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 更新的主要内容有:1、SSL 同時支援阻塞、非阻塞模式,2、線程池伺服器模闆更好地支援線上更新,3、TCP 派發器提供了管理接口用于狀态彙報,4、工程檔案整理。
acl 包括以下豐富的常用函數庫:
1、常見網絡應用庫: SMTP 用戶端庫/PING 庫/memcache 用戶端庫/handlersocket 用戶端庫/beanstalk 用戶端庫
2、HTTP 網絡庫:HTTP 用戶端/服務端庫,C++版 HttpServlet 類,HTTP COOKIE/HTTP SESSION 等
3、郵件解析庫:mime解析庫/RFC2047/RFC2048/mime base64/mime qp/mime uucode 等
4、網絡通信庫:阻塞/非阻塞網絡 IO 庫(其中 lib_acl_cpp 庫通過嵌入 polarssl 而具備了 SSL 的能力)
5、伺服器架構:包括程序池模式、線程池模式、非阻塞模式、UDP通信模式及觸發器模式
6、事件引擎:支援 select、poll(for unix)、epoll(for linux)、kqueue(for bsd)、devpoll(for solaris)、iocp(for win32)、win32 視窗消息(for win32)事件引擎
7、通用連接配接池庫:高效的連接配接池基礎類庫,支援豐富的功能
8、資料庫用戶端庫:對原生的資料庫用戶端庫進行了二次封裝,使程式設計更為簡易,功能更為豐富
9、xml/json 流式解析庫:差別于網上其它已有的 xml/json 解析庫,acl 中的 xml/json 解析庫采用有限狀态機方式解析資料,處理方式更為靈活
一、基礎 C 庫:lib_acl
.新特性:json 子產品增加了構造布爾型和數值型的接口
.新特性:事件引擎子產品可以區分 ACL_EVENT_ACCEPT/ACL_EVENT_CONNECT 與 ACL_EVENT_READ/ACL_EVENT_WRITE 事件類型
.新特性:acl_json_util.c 中增加了流式将 JSON 對象轉為字元串的函數 acl_json_building,這樣當 JSON 對象比較大時使用該函數可以有效防止要求系統配置設定非常大的記憶體空間而導緻配置設定記憶體失敗
.新特性:acl_pthread_pool.c 中增加了 acl_pthread_pool_idle,
acl_pthread_pool_busy 兩個函數,分别用來獲得目前線程池中的空閑線程數及繁忙線程數
.新特性: acl_threads_server.c 伺服器模闆當子程序退出時會優先調用應用回調函數,由應用回調函數優先決定是否退出
.新特性:acl_mystring.c 中增加了 acl_find_blank_line 函數,用來從給定資料中查找空行的位置
.新特性:acl_trace.c 中增加了 acl_log_strace() 函數用來将函數調用堆棧輸出至日志檔案中
.新特性:acl_trace.c 中的函數 acl_trace_info 增加了防止遞歸嵌套的功能
.新特性:acl_threads_server.c 當采用 TCP 連接配接分發方式時,增加了彙報給分發器的資訊字段,以便于分發器根據這些字段決定分發的政策
.新特性:acl_vstream.c 中循環寫函數(loop_writen)支援逾時寫功能
.新特性:acl_msg.c 中的 acl_msg_error/warn/fatal/panic 支援記錄函數調用堆棧
.性能:acl_vstream.c 優化了讀 (__sys_read) 的性能
.問題修複: acl_json_util.c 中将 JSON 對象轉為字元串的函數 acl_json_build
不能支援某些情形
.問題修複:acl_json_util.c 中的函數 json_escape_append 不應針對字元 '/' 進行轉義
.問題修複:acl_vstream.c 在寫時有可能會造成死循環
.問題修複:acl_vstream.c 中函數 __sys_read 的标志位 sys_read_ready 置 0 應該在 read_fn/fread_fn 函數傳回後
.問題修改:acl_aio_read.c 中的 reactor IO 方式的函數 acl_aio_enable_read 内部在某種情況下有可能不會觸發讀回調過程
.問題修複:acl_sys_socket.c 中的讀/寫逾時參數 timeout 不起作用
.問題修複:acl_threads_server.c/acl_aio_server.c 伺服器模闆,當采用 TCP 分發方式時,如果 acl_master reload 後若子程序配置的不是立即退出,則該子程序會重試連接配接 TCP 派發器進而導緻該子程序永不會退出
.問題修複:snprintf.c 中 acl_secure_snprintf/acl_secure_vsnprintf 在調用 _vsnprintf_s 時有誤,第三個參數需傳入 _TRUNCATE,否則當緩沖區較小時會産生斷言
.問題修複:acl_threads_server.c 将對用戶端 IP 位址通路權限的處理過程放在 client_wakeup 中,否則會造成 master_threads2 類産生 core
.其它:整理庫的所有頭檔案,使之更規範
二、lib_protocol 庫
.問題修複: http_hdr_req.c 中的函數 __strip_url_path 仍然存在問題,因為輸入的兩個參數有可能指向相同的記憶體位址,進而導緻第二個參數被賦 '\0',是以應該把 ACL_VSTRING_RESET/ACL_VSTRING_TERMINATE 放在 acl_argv_split 之後
.問題修複:http_hdr_req.c 中當重複使用線程局部變量時調用 __hdr_reset 來重置其中的一些參數,雖然調用了 ACL_VSTRING_RESET,但該宏并不會将緩沖資料尾部置 0,導緻舊的資料會被重複使用
問題修複: proto_snprintf.c 中函數 proto_secure_snprintf/proto_securevsnprintf 在調用 _vsnprintf_s 時第三個參數應該為 _TRUNCATE,否則當緩沖區給的比較小時VC提供的 API 内部會産生斷言
三、lib_acl_cpp 庫
.新特性:locker 類增加了 try_lock 方法
.新特性:xml 類增加了幾個方法
.新特性:json 類增加了構造布爾型和數值型的接口
.新特性:stream_setup 類現在可以支援 aio_stream 非阻塞流了
.新特性:polarssl_io 類增加了支援非阻塞 IO 的方法
.新特性:string 類增加了 find_blank_line/find_reset 方法,用來友善從目前緩沖區中查找一個空行的位置
.新特性:string 類增加了 substr 方法,用來從目前緩沖區中提取資料
.新特性:master_threads2 類增加了 proc_exit_timer 虛函數,當子程序需要退出時伺服器模闆将會回調該虛函數以決定子程序是否可以退出
.新特性:master_threads2 類增加了 thread_on_handshake 方法,當服務端調用完 thread_on_accept 後可以在子線程中調用 thread_on_handshake 方法,以處理較長的任務
.問題修複:snprintf.cpp 中函數 snprintf/vsnprintf 在調用 _vsnprintf_s 時第三個參數應該為 _TRUNCATE,否則當緩沖區給的比較小時VC提供的 API 内部會産生斷言
.問題修複:fstream::open 方法在打開檔案時先調用基類 stream::open_stream,然後基類函數再調用 C 庫 acl_vstream_fdopen 時沒有說明打開流的類型,導緻内部流對象 ACL_VSTREAM 的關閉回調函數設定有誤
.問題修複:http_response 類中當調用 read_header 方法時,需要自動将 head_sent_ 置為 false,以便于同一連接配接的下一次會話時可以正确發送 HTTP 響應頭
.問題修複:istream 類中的 xxx_peek 函數在讀出錯時沒有判斷 errno 為 ACL_EWOULDBLOCK 的情況,在非阻塞方式下,當讀傳回 -1 且 errno 為 ACL_EWOULDBLOCK 時并不表示讀出錯
.問題修複:polarssl_io 類在非阻塞模式下有可能會阻塞在 IO 上
.新示例:增加了 json 測試用例 json/json7
.新示例:新 string/blank_line 示例,用來測試上面新增的方法
四、參考連結:
技術部落格: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/acl-dev/acl
QQ 群:242722074