網絡通信與服務器框架,acl 3.1.3 版本發布
acl 3.1.3 版本發布了,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 升級的主要內容有:修復了 lib_acl_cpp 庫中 redis 模塊中幾處 BUG,增加了對 redis geo 地理位置操作的支持;增加數據庫連接池集群管理功能;有針對性地優化了某些模塊的性能;HTTP 模塊增加了服務端響應 gzip 數據的功能;其它大量的功能特性增加。acl 包括以下豐富的常用函數庫:
1、常見網絡應用庫: SMTP 客戶端庫/PING 庫/memcache 客戶端庫/handlersocket 客戶端庫/beanstalk 客戶端庫/redis 客戶端庫/disque 客戶端庫
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
.新特性:acl_dbuf_pool.c 增加了 acl_dbuf_pool_reset 方法,可以方便該內存池被重復使用
.新特性:acl_msg.c 文件中,即可以將日志信息記入文件中,同時又可以輸出至屏幕
.問題修復:acl_urlcode.c 中函數 acl_url_decode 當輸入串非法時有可能造成內存溢出
.性能:acl_read_wait.c 中函數 acl_read_wait 在 linux 下采用 epoll,性能提升不少
.性能:acl_vstream.c 性能優化,acl_vstream_read 提供預讀功能
.性能:acl_dbuf_pool.c 性能優化,將內存分配次數由原來的三次減少
至一次
.性能:acl_json.c/acl_vstring.c 支持使用 ACL_DBUF_POOL 內存池進行內存分配,從而大大提升了性能
.編譯:支持在 VC x64 環境下編譯使用
.其它:為了防止因在 acl_define_win32.h 中將 FD_SETSIZE 設置的過大而導致進程在64位環境下堆棧溢出(VC 編譯時的默認堆棧為1MB),將 FD_SETSIZE 設為 40000
二、lib_protocol 庫
.問題修復: http_hdr.c 中的函數 http_hdr_print/http_hdr_fprint/http_hdr_sprint 應過濾掉被禁掉的 HTTP 部字段
.編譯:支持在 VC x64 環境下編譯使用
.編譯:去掉了 -pedantic 編譯選項,因為其與 FUNCTION 沖突
三、lib_acl_cpp 庫
.特性:locker.cpp 中類 locker 增加了針對自旋鎖的支持
.特性:新增 redis_session 類
.特性:db_handle.cpp 中的 db_row 類增加了 field_double 方法
.特性:增加了類 thread_queue 用來處理線程消息隊列
.特性:dbuf_pool 類增加了 dbuf_reset 方法,可以重復使用該類對象
.特性:http_client 類增加了幾個用于 HTTP 頭部字段修改的方法
.特性:HttpServletRequest 類增加了 getRange 方法用于數據斷點續傳過程中
.特性:http_client 類增加了 get_range 方法,用于數據斷點續傳過程中
.特性: HttpServlet 類增加了自動判斷是否需要與客戶端保持長連接的方法
.特性:增加了 redis_geo 類,用于支持 redis 地理位置信息處理功能
.特性:db 模塊的查詢類 query 添加了 double/float 類型
.特性:HttpServletRequest 類增加了直接提出 xml 和 json 對象的方法
.特性:HttpServlet 類中的方法 doRun 內部在響應客戶端請求時,會首先根據客戶端的請求頭字段(Connection) 自動設置響應頭中的 Connection 頭字段
.特性:針對標準輸入輸出增加了兩個流對象:stdin_stream, stdout_stream
.特性:db_handle/db_mysql/db_sqlite 類中提供了靜態方法用來設置動態庫動態加載的全路徑
.特性:延長了 xml/json 模塊在遍歷時產生的臨時結點對象的生命周期
.特性:db 模塊增加了數據庫連接池集群管理
.特性:mysql_manager 支持設置連接池中每個連接的空閑生存周期
.特性:增加靜態方式 log::debug_init 方便打調試日志記錄接口
.特性:HttpServlet::doRun 方法在第一次 IO 出錯時才會調用 doError 方法
.特性:HttpServletRequest 類的方法 getContentType 增加了一個 http_ctype 類對象指針,允許用戶可以獲得更多的 Content-Type 中的信息
.特性:http_ctype 類支持對象拷貝功能
.特性:HttpServletResponse 類中的輸出流對象采用了統一了 http_client 類型
.特性:http_client 類支持響應 gzip 壓縮類型的數據
.特性:http_client/http_request 類在讀取壓縮數據體時,會自動處理臨時處理結果為 0 的情況,以降低使用復雜度
.特性:db_handle/db_mysql 支持事務提交接口
.特性:string 類在進行 base64 解碼時,需要自動在尾部添加 \0 以防止使用者緩沖區溢出
.問題修復:redis 模塊中的一些使用變參的方法中有的地方漏掉了第一個變參
.問題修復:redis_client_cluster 中的前向類聲明 redis_pool 應該為 redis_client_pool
.問題修復:redis_key.cpp -> randmkey 請求命令組包有誤
.問題修復:redis_zset 類有一處在調用 sizeof 時存在問題
.問題修復:beanstalk::ignore_all 內部有內存泄露
.問題修復:redis_hash::hexists 判斷返回值有誤
.問題修復: redis_script.cpp 中 eval_cmd 函數的 key 個數計算方式有誤
.問題修復: redis_command.cpp 中的 run(redis_client_cluster*, size_t) 函數中可能存在當 conn 對象被釋放后再次非法引用的情形,現在將該對象的釋放放在引用的代碼之后
.問題修復:dbuf_pool 類對象必須動態創建,因此需要將析構函數設為私有方法
.問題修復: redis_command::redirect() 函數內當 cluster->peek() 返回 NULL 時應該直接返回 NULL
.問題修復:redis_zset::zrange_get_with_scores 在取得結果時處理的順序存在問題
.問題修復:redis_string::incoper 內部在區分 INCR 與 INCRBY, DECR 與 DECRBY的方法有誤
.問題修復:redis_command/redis_key/redis_hash/redis_set/redis_zset 在遍歷過程中,可能服務端會返回 cursor 為 > 0 但結果集為空的情況,需要對這種情況進行處理
.性能:redis_command 類當每一個命令處理完畢后不再釋放內存池對象,而是復用之
.編譯:消除了在 MACOSX 上的一些編譯錯誤
.編譯:支持在 VC x64 環境下編譯使用
四、示例
.示例:增加示例 samples/redis/redis_geo 用來測試地理信息模塊類 redis_geo
.示例:samples/db/mysql_query: 完善了示例功能
.示例:增加了示例 samples/db/mysql_pool,用來測試多線程環境下的數據庫連接池操作
.示例:samples/redis,測試用例中針對出錯地方增加了錯誤內容提示
.其它:類 db_pool 中的 peek 方法被注為過期的,建議使用 peek_open 方法,使用方式更為簡單
五、參考鏈接:
下載:http://sourceforge.net/projects/acl/
國內鏡像:https://git.oschina.net/zsxxsz/acl
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!