acl 跨平台网络通信服务器编程框架 3.0.22 版本发布

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