网络通信与服务器框架,acl 3.1.3 版本发布
jopen 9年前
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