Skip to content

acl.3.2.0 released!

Compare
Choose a tag to compare
@zhengshuxin zhengshuxin released this 27 Aug 12:49
· 3844 commits to master since this release

acl 3.2.0 版本发布了,acl 是 one advanced C/C++ library 的简称,主要包括网络通信库以及服务器框架库等功能,支持 Linux/Windows/Solaris/FreeBsd/MacOS 平台;整个 acl 项目主要包含三个函数库:lib_acl(纯C开发的基础库,主要包含网络通信及服务器编程框架以及其它丰富的功能)、lib_protocol(包含 HTTP/PING/SMTP 通信协议的C语言实现)、lib_fiber(网络协程库)、lib_acl_cpp(基于 lib_acl 及 lib_protocol 两个C库,提供了更为强大的编程接口及丰富的功能类)。
本次 acl 升级的最主要内容为:增加了类似于 golang 中的网络协程库,该库使 C/C++ 程序员可以以顺序编程的思维方式快速地编写出高并发、高性能的网络服务器程序; 此外,lib_acl/lib_acl_cpp 也进行了功能改进和问题修复。

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 解析库采用有限状态机方式解析数据,处理方式更为灵活
11、网络协程库:该库将阻塞 IO 模式在底层通过上下文切换和事件触发方式转变为非阻塞模式,从而方便程序员快速编写高并发、高性能的网络服务

示例:
1、lib_acl/samples: 该目录下有大量的基于 lib_acl C 库的示例
2、lib_protocol/samples: 该目录下有大量的基于 lib_protocol C 库的示例
3、lib_acl_cpp/samples: 该目录下有大量的基于 lib_acl_cpp C++ 库的示例
4、lib_fiber/samples:该目录下有大量的基于协程的网络客户端/服务端示例

应用:
1、app/redis_tools: 该目录下为 redis 集群管理、监控及智能创建工具
2、app/wizard:用来自动生成 acl 服务器框架的向导程序
3、app/master_dispatch:用于管理和分发客户端连接的服务程序
4、app/gid:用来产生全局唯一整型 ID 的服务程序及客户端库
5、app/wizard_demo:为一些服务器测试程序

一、基础 C 库:lib_acl
.新特性:acl_threads_server.c 在 alone 模式下运行时,释放全局分配的动态对象,以便于用户使用 valgrind 查找内存问题
.新特性:acl_read_wait.c 中的读超时重新使用 epoll 来判断,为防止 epoll 句柄被异外关闭,内部增加了重新打开 epoll 句柄的功能
.新特性:acl_xml_parse.c/acl_xml2_parse.c 当输入为 NULL 时返回 ""
.新特性:在 acl_vstream.c 的 acl_vstream_fdopen 时针对带有读写超时的 socket 的设置为非阻塞模式,这样代码逻辑更为清晰
.新特性:acl_sys_socket.c 中的 SOCKET IO 过程允许被 HOOK,这样 acl_vstream.c 中的 acl_vstream_fdopen 在创建 SOCKET 流对象时允许使用被 HOOK 的函数
.新特性:增加原子操作 acl_atomic.c, 无锁队列 acl_yqueue.c, acl_ypipe.c
.新特性:增加 acl_mbox.c 用于线程之间的单向通信,内部使用了无锁队列方式效率更高
.新特性:json 解析器支持 double 数据元素

.问题修复:acl_sys_socket.c 中函数 acl_socket_write 修改了写超时的问题
.问题修复:acl_sys_file.c 中的函数 acl_file_open 当以 O_APPEND 方式打开文件时, 文件指针没有指向文件尾部
.问题修复:events_kernel.c 中的 stream_on_close 当 fdp == NULL 时直接返回
.问题修复:events_epoll_thr.c 中的 event_enable_read 函数里,解锁调用过程 THREAD_UNLOCK 需要 epoll_ctl 调用之后,以免主线程和子线程同时操作同一对象
.问题修复:acl_vstream.c 中的 acl_vstream_writevn 函数数据指针偏移有问题,导致写入的数据量计数错误
.问题修复:events.c 中的函数 event_thr_prepare/event_prepare 中,如果当 ACL_VSTREAM_BFRD_CNT 及 read_ready 两个条件同时满足时,ACL_VSTREAM_BFRD_CNT 满足条件如果放置在 read_ready 前面,会造成 read_ready 被提醒清除,因此,需要把 read_ready 条件放置在前面
.问题修复:acl_json_parse.c 中,在解析 JSON 过程中需要设置叶节点标志

.性能:events_epoll_thr.c 的 event_enable_read 函数中,通过设置/清除标志位 EVENT_FDTABLE_FLAG_FIRE 来达到减少 epoll_ctl 的调用次数,从而提高事件处理性能

二、lib_protocol 库
.特性:http_hdr_res.c 中的函数 http_hdr_res_parse 取消了对 http_status 的检查,以便于应用使用自定义状态码

三、lib_acl_cpp 库
.新特性:xml/xml1/xml2 在进行对象构造时允许初始化 dbuf 的参数
.新特性:http_header 类中的方法 set_url 增加参数 encoding,该参数决定是否对出现于 url 中的参数进行 url 编码
.新特性:dbuf_guard 类将容纳 dbuf_obj 的数组封装在链表中,以免该数组过大
.新特性:xml/xml1/xml2 类中的方法 update 允许返回剩余的 xml 数据
.新特性:json 增加对 double 类型的支持
.新特性:mime 类增加两个方法 get_plain_body/get_html_body 便于提取不同类型的
.新特性:Makefile 添加条件编译选项:允许在编译时以 make polarssl=on 方式将 POLARSSL 编译进去

.问题修复:thread 类中,在创建线程后对 thread_id_ 赋值时,可能会因为线程创建足够快且用户提前释放了线程对象而造成内存非法访问
.问题修复:http 模块设置的读超时与 stream 的读超时冲突
.问题修复:http_request 类的get_body方法中,对象 ps 为局部变量,出作用域后依然被使用而导致崩溃
.问题修复:string 类应该只检查空指针,而不应检查空串
.问题修复:mime::body_node 取正文有误
.问题修复:json_node::set_text 判断节点是否为叶节点的方法有误

四、参考链接:
oschina-git:https://git.oschina.net/zsxxsz/acl
github: https://github.com/zhengshuxin/acl.git
sourceforge:http://sourceforge.net/projects/acl/
blog: http://zsxxsz.iteye.com/