C/C++ server and network library, including coroutine,redis client,http/https/websocket,mqtt, mysql/postgresql/sqlite client with C/C++ for Linux, Android, iOS, MacOS, Windows, etc..
LGPL-3.0 License
Bot releases are hidden (Show)
Published by zhengshuxin almost 9 years ago
fixed one urgent bug in acl_read_wait
Published by zhengshuxin almost 9 years ago
acl 3.1.4 版本发布了,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 升级的主要内容有:完善并丰富的 dbuf(内存池)模块,并在 acl 的多个模块中使用,增加了撰写邮件模块类,增加了基于内存映射的 xml 解析器;修改一些 BUG 问题,同时增加了一些功能点。
acl 包括以下丰富的常用函数库:
1、服务器框架:包括进程池模式、线程池模式、非阻塞模式、UDP通信模式及触发器模式
2、网络通信库:阻塞/非阻塞网络 IO 库(其中 lib_acl_cpp 库通过嵌入 polarssl 而具备了 SSL 通信能力)
3、HTTP 网络库:HTTP 客户端/服务端库,HTTP 服务端支持 HttpServlet 接口访问方式;支持 HTTP cookies/session;HTTP 客户端支持连接池及连接池集群
4、redis 客户端库:实现了 redis 客户端命令中 12 个大类中的总共 150 多个命令,支持连接池及集群连接池方式
5、常见网络应用库: SMTP 客户端库/PING 库/DNS 解析库/memcache 客户端库/handler socket 客户端库/beanstalk 客户端库/disque 客户端库
6、邮件解析库:mime解析库/RFC2047/RFC2048/mime base64/mime qp/mime uucode 等
7、事件引擎:支持 select、poll(for unix)、epoll(for linux)、kqueue(for bsd)、devpoll(for solaris)、iocp(for win32)、win32 窗口消息(for win32)事件引擎
8、通用连接池库:高效的连接池基础类库,支持丰富的功能
9、数据库客户端库:对原生的数据库客户端库进行了二次封装,使编程更为简易,功能更为丰富,支持连接池及连接池集群管理功能
10、xml/json 流式解析库:区别于网上其它已有的 xml/json 解析库,acl 中的 xml/json 解析库采用有限状态机方式解析数据,处理方式更为灵活
一、基础 C 库:lib_acl
.新特性:json 解析器增加支持判断是否解析完毕的功能
.新特性:json 解析器支持最外层为数组类型,同时完全支持:bool, number, null 类型的数据
.新特性:json 解析器增加了函数 acl_json_getFirstElementByTagName
.新特性:acl_dbuf_pool.c 中的 acl_dbuf_pool_reset 函数在重置内存池时支持保留指定长度的缓冲区
.新特性:增加了 acl_dbuf_pool_free, acl_dbuf_pool_keep, acl_dbuf_pool_unkeep 三个函数,同时优化 acl_dbuf_pool_reset 函数,当某个内存块有标识为保留的内存段时并不会释放
.新特性:acl_dbuf_pool.c 在调用 acl_dbuf_pool_free 时可以有效地释放掉大内存,这样在 acl_vstring.c 中在进行大内存扩充时可以有效地将大内存优先释放掉
.新特性:acl_urlcode.c 中引用了 ACL_DBUF_POOL 内存池
.新特性:acl_htable.c 中新增函数 acl_htable_delete_entry
.新特性:acl_array.c, acl_xml.c 引入了 ACL_DBUF_POOL,从而提升了性能
.新特性:增加新的 xml 编解码函数,其中的参数指定输出缓冲区大小
.新特性:acl_xml_parse.c 支持解析有多个或单个 xml 根节点的 xml 文档
.新特性:acl_xml2 增加了将 xml 对象转换为字符串的功能
.新特性:新增 xml 解析器 acl_xml3,该解析器性能与 RapidXML(号称世界上最快的)解析器的性能几乎相当
.新特性:acl_xml2 解析器支持文件空间大小自动扩充方式
.新特性:acl_xml2 解析器新增接口 acl_xml2_mmap_alloc,方便以内存文件映射方式对 xml 文件进行解析和创建
.新特性:acl_xml_parse.c / acl_xml2_parse.c 可以解析 CDATA
.问题修复:acl_atoui64/acl_atoi64 在 WINDOWS 平台使用 VC2012 编译时有问题,因为内部所用的 VC 提供的 API _atoi64 有问题,当转换最大的 64 位整数(18446744073709551615)
.问题修复:acl_json_parse.c 针对 -xxx 或 +xxx 也应识别为数值类型
.问题修复:acl_xml_util.c 中 acl_xml_build 进行 xml 特殊字符转义时有误
.问题修复:acl_dbuf_pool.c 中在调用 acl_dbuf_pool_reset 时在遇到保留内存块时应该保留整个内存块,且偏移地址保持不变
.问题修复:acl_vstream.c 中的函数 sys_read 中必须在调用 fread_fn/read_fn 前清除可读标志位,这样 IO 钩子函数在重置该标志位时才能生效
.问题修复:将清除 ACL_VSTREAM::sys_read_ready 标志位的操作从 acl_vstream.c 的函数 sys_read 中移除,在 acl_sys_socket.c 的函数 acl_socket_read 进行清除该标志位
.问题修复:acl_xml.c/acl_xml2.c/acl_xml3.c 在删除节点时在在残留问题
.问题修复:acl_vstream.c 中当 read/write 接口被注入时,因为没有对应的 writev 注入方式,所以需要多次调用 write 来模拟 writev 过程
.问题修复:acl_sys_socket.c 的函数 acl_socket_read 中没有清除流对象的系统可读标志位, 可能会造成读阻塞或异步读时的死循环
.问题修复:acl_aio_write.c 的函数 acl_aio_writen 中在一处返回时未将嵌套层级减一,可能会阻塞写过程
.性能:acl_xml_util.c 中的函数 acl_xml_create_node 在创建节点时,如果正文内容比较大,则会因内存的快速频繁膨胀而造成性能损耗,现在采用了预分配策略,以减少这种性能损耗
.性能:acl_xmlcode.c 中的函数 acl_xml_encode/acl_xml_decode 通过
提前预分配内存,以减少重复分配/释放内存的次数,从而在一定程度上提升内存操作性能
.性能:events.c, events_kernel.c, events_iocp.c, 在每一个事件循环处理完毕时,如果依然有一些描述字的缓冲区还有数据,则立即触发下一个事件循环过程,从而保证了 IO 读的处理效率
二、lib_protocol 库
.问题修复: http_hdr_res.c/http_hdr_req.c 中有可能会因为 main_cache_free 的调用在 http_hdr_res_free/http_hdr_req_free 之前调用而造成内存冲突
三、lib_acl_cpp 库
.新特性:locker 互斥类增加了 lock_guard 类以便于简化加锁/解锁操作
.新特性:添加 smtp_client 类用来发送电子邮件,同时支持 SSL 方式发送邮件
.新特性:smtp 模块增加了邮件合成的功能
.新特性:connect_pool/connect_manager 连接池及连接池管理类允许设置无连接数上限
.新特性:json 解析器增加支持判断是否解析完毕的功能
.新特性:json_node 类增加了节点类型的判断方法
.新特性:json 类添加了新方法 getFirstElementByTagName
.新特性:json 类增加了重载运行符[]接口,方便用户获得第一个匹配对象
.新特性:http 模块中的 HttpServlet 类增加了 doOther 虚接口,从而可以支持其它未知的 HTTP 请求方法
.新特性:string 类中的方法 strip 采用写时拷贝技术
.新特性:string 类增加了方法 equal 用来比较两个 string 对象里的内容
.新特性:redis_client_cluster/redis_client_pool/redis_client 支持连接成功后使用连接密码进行身份验证,从而使 redis 的集群模块支持密码验证功能
.新特性:url_coder 类内部采用 dbuf_pool 内存对象进行分配管理
.新特性:dbuf_pool 类重载的 new 允许调用者指定所分配的内存块的倍数
.新特性:dbuf_pool.cpp 中增加了内存池管理类 dbuf_guard 及内存池对象类 dbuf_obj,以方便使用 dbuf_pool 内存池
.新特性:dbuf_obj 类增加了 nrefer_,便于 dbuf_guard 进行安全管理,以防止被 dbug_guard 类对象重复释放
.新特性:dbuf_guard 类增加了更多方便操作的方法,同时使数组对象也在内存池对象上创建
.新特性:dbuf_guard 类增加了模板函数 create,可更加方便地创建任何继承于 dbuf_obj 的子类对象
.新特性:url_coder 类继承于 dbuf_obj 从而纳入 dbuf_guard 管理
.新特性:连接池模块简化接口设计,允许连接集群管理器在添加新的连接池时设置超时时间,从而使连接池集群管理器针对不同的服务器地址采用不同的超时时间,这样可以使连接池模块适应于异构网络环境中
.新特性:http_request/http_request_pool/http_request_manager 类支持 SSL 通信方式
.新特性:增加了 xml1.cpp/xml1.hpp 以便于支持第一个 xml 解析器
.新特性:增加了 xml2.cpp/xml2.hpp 以便于支持第二个 xml 解析器
.新特性:xml2 新增构造函数,可以更方便地使用内存文件映射方式解析和创建 xml 对象(目前仅支持 UNIX)
.新特性:xml2 类新增构造函数以文件句柄为构造参数
.新特性:xml_node 类中增加接口 detach 用于将一个 xml 节点从 xml 对象树中分离
.问题修复:redis_zset::zrangebyscore_get 其中的 argc 计数有误
.问题修复:redis_command 类中有两处 build 函数在构建请求命令时应该支持二进制格式
.问题修复:redis_zset::zstore 在判断 aggregate 时有误
.问题修复:连接池基础类 connect_pool 中的方法 check_idle 当参数 exclusive 为 false 时会造成提前解锁; 该 BUG 影响所有该类的子类
.问题修复:string 类中的方法 strip 在当其中的参数 each 为 true 时分析方法有误
.问题修复:string 类中的方法 strip 当其中参数 each 为 false 时分析方式有误
.问题修复:db_mysql 类内部在出错重连时,没有使用初始连接时使用的字符集
.问题修复:HttpServletRequest 类中方法 readHeader 当调用方法 getContentLength 时返回 -1,则会造成下面调用 acl_mymalloc((size_t) len + 1) 时崩溃,现在针对 getContentLength 返回 -1时,直接返回
.问题修复:mail_message 类中的 append_addrs 方法存在一处指针溢出的 BUG
.问题修复:修复了 dbuf_obj 构造函数中的 BUG,应该首先将 nrefer_ 初始化为 0
.问题修复:dbuf_guard 类在创建数组容器时需要调用 dbuf_keep 以保留内存池中的所在内存块
.问题修复:dbuf_guard 类中在调用 dbuf_reset 时应该首先将所有管理的对象进行析构
.问题修复:zlib_stream 类在加载 zlib1.dll 库时不应该打开 deflateInit2,而应该打开 deflateInit2_ 地址,因为 deflateInit2 只是一个宏定义,而 deflateInit2_ 才是动态库的函数地址
.问题修复:polarssl_io::read 中当 ssl_read 返回数据后,应该通过调用函数 ssl_get_bytes_avail 判断 SSL 缓冲区中是否还有数据,如果有,则应该设置 ACL_VSTREAM::sys_read_ready 标志位
.问题修复:db_mysql 类中,在初始 mysql 连接时,因为 libmysqlclient 库内部会通过 mysql_thread_init 初始化每个线程的线程局部变量,但却不会在线程退出前自动释放这些线程局部变量,这在多线程环境下会造成内存泄露,因为在 db_mysql 类内部增加了线程退出前调用 mysql_thread_end 来释放这些线程局部变量
.问题修复:xml1/xml2 类中的方法 reset 应该将 root_ 节点删除,因为调用 acl_xml_reset/acl_xml2_reset 后 xml 对象中 root 节点被释放,此时 root_ 节点所引用的根节点已经不存在
.性能:http 模块的相关类(HttpCookie, http_header, HttpServlet, HttpServletRequest, HttpServerResponse)通过引入会话内存池(dbuf_pool)进行内存管理,从而大大提高了处理性能
.编译:VC2010 工程中未包含 thread_queue 类的源文件和头文件
四、参考链接:
下载:http://sourceforge.net/projects/acl/
国内镜像:https://git.oschina.net/zsxxsz/acl
技术文章:http://zsxxsz.iteye.com/
Published by zhengshuxin about 9 years ago
本次 acl 升级的主要内容有:修复了 lib_acl_cpp 库中 redis 模块中几处 BUG,增加了对 redis geo 地理位置操作的支持;增加数据库连接池集群管理功能;有针对性地优化了某些模块的性能;HTTP 模块增加了服务端响应 gzip 数据的功能;其它大量的功能特性增加。
一、基础 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 方法,使用方式更为简单
Published by zhengshuxin about 9 years ago
Published by zhengshuxin about 9 years ago
Published by zhengshuxin over 9 years ago
The new version for acl 3.1.2 was released now. In this release, some bugs in redis cluster were fixed, a new redis builder tool was completed, and a client library for disque server was added.
Published by zhengshuxin over 9 years ago
This is a rc1 for acl 3.1.2. In this version, some redis cluster bugs were fixed, and add one redis cluster tool named as redis_builder, which was a alternative tool of the official redis-trib.tb and was written by C++.
Published by zhengshuxin over 9 years ago
This version has supported redis cluster3.0, and fix some bugs in some modules.
Published by zhengshuxin over 9 years ago
该版本主要提供了全部 redis 客户端命令的接口类,可以更方便地使用 redis-server;该 redis 库不同于其它的 C/C++ 库,该库提供了 redis 中 12 个大类中150 多个命令的接口实现,同时提供了连接池及连接池集群管理功能。
Published by zhengshuxin almost 10 years ago
该版本主要的改进是:强化了SSL通信功能,同时支持阻塞/非阻塞通信两种方式;增强了服务器模板退出功能;增强了服务器集群管理功能
Published by zhengshuxin almost 10 years ago
本次 acl 升级的主要内容有:使头文件的定义更为规范化、增加了新的防 SQL 注入查询器、进一步丰富了服务器框架的功能。
Published by zhengshuxin about 10 years ago
该版本除了修复一些已知的 BUG 外,同时增加了针对 FreeBSD 的支持,以及完善了针对 Polarssl 的支持
Published by zhengshuxin over 10 years ago
该版本主要是一些小的 BUG 的修改、功能改进及代码整理。
Published by zhengshuxin over 10 years ago
本版本的服务器模板更为稳定,性能更高,功能更强大
Published by zhengshuxin over 10 years ago
在最新的线程池中存在一个严重的链表操作BUG,会导致进程崩溃
Published by zhengshuxin over 10 years ago
该版本主要是优化了线程池任务调度算法,提升了线程池工作性能;同时优化了多线程事件引擎的效率