acl 3.1.1 版本实现跨平台网络通信与服务器框架

2015年03月30日 10:21 288 次阅读 来源: 开源中国 作者: 路人甲
摘要 acl 3.1.1 版本发布了,acl 是 one advanced CC++ library 的简称,主要包括网络通信库以及服务器框架库等功能,支持 LinuxWindowsSolarisFreeBsdMacOS 平台;整个 acl 项目主要包含三个函数库:lib_acl纯C开发的基础库,主要包含网络通信及服务器编程框架以及其它丰富的功能、lib_protocol包含 HTTPPINGSMTP ...

        acl 3.1.1 版本发布了,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 升级的主要内容有:acl redis 模块完全支持集群版 redis3.0。除此之外,还包含一些小的功能改进与完善,以及一些 BUG 的修复。


acl 包括以下丰富的常用函数库:

1、常见网络应用库: SMTP 客户端库/PING 库/memcache 客户端库/handlersocket 客户端库/beanstalk 客户端库/redis 客户端库

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_msg.c 增加了函数 acl_msg_trace_enable 用来设置当写出错或警告类型的日志时是否记录函数的调用堆栈

新特性:增加了 CRC17 的哈希算法 acl_hash_crc16


问题修复:acl_master 服务器框架当设置了 master_prefork 后可能会导致master_maxproc 不起作用,原因是 master_avail.c 中的 master_prefork 函数的限制问题,现在修改 master_avail_event 函数,当 master_prefork 返回 0 时再判断是否还需要 fork 子进程;该 BUG 仅影响多进程服务器模板,对其它服务器模板(如:非阻塞、多线程 等)没有影响

问题修复:acl_single_server.c 多进程服务器模板的空闲超时退出机制存在问题

问题修复:acl_trace.c/acl_trace_info 中的变量 results 在调用系统的 backtrace_symbols() 函数后应该释放,否则会造成内存泄漏

问题修复:acl_threads_server.c/acl_aio_server.c 当进程退出时,需要通知 acl_master 主进程自己当前不可用,同时需要关闭与前端 TCP 派发器(master_dispatch)的连接

 问题修复:修改 acl_read_wait.c/acl_write_wait.c, 在 WIN32 平台下调用 select 时不必检查 fd 与 FD_SETSIZE 的关系,因为 WIN32 下的 fd_set 结构定义及 FD_XXX 宏的实现原理与 UNIX 不同,并且 WIN32 下的 fd 是不连续的,有可能会出现非常大的值,所以其中检查 fd < FD_SETSIZE 有可能会导致崩溃,其实也完全没有必要检查


二、lib_protocol 库

三、lib_acl_cpp 库

新特性:redis_command 增加了几个方便调用的方法,使用户可以通过 redis_command 类对象直接调用 redis_result 类对象中的方法

新特性:redis 客户端库完善了针对集群版本 redis3.0 的支持

新特性:redis 客户端集群版增强了针对服务器掉线的容错功能

新特性:redis 客户端库提供了一个统一的类 redis,该类继承了所有的命令 redis 命令类,只需使用这一个类便可以执行所有的 redis 命令

新特性:beanstalk 类增加了一些出错提示功能


问题修复:连接池基础类 connect_pool 类中的函数 put 当参数 delay_destroy_ 为 true 时,若 count_ > 0 返回时没有对互斥锁 lock_ 解锁,从而会造成其它使用该 连接池对象的线程调用 put 函数加锁时永远等待

问题修复:http_header 类中的方法 set_method(const char* method) 需要对 method_s 进行赋值

问题修复:server_socket::open() 当用户输入的地址为 ip:0 时,需要重新调用 acl_getsocketname 来获得真正监听的地址

问题修复:redis_command::scan_keys 内部在使用指针参数 count 时有问题


四、示例

1、samples/redis_cluster: 测试 redis 集群模式的例子

2、samples/redis: 增加了 redis, redis_cluster2 两个测试用例

还可以输入136 讨论区:
评 论