阅读更多

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/

github: https://github.com/zhengshuxin/acl
国内镜像:https://git.oschina.net/zsxxsz/acl
技术文章:http://zsxxsz.iteye.com/

1
0
评论 共 0 条 请登录后发表评论

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • Visual Basic控件大全.

    Visual Basic各类实用的控件,

  • 升级到 Microsoft .NET ->Visual Basic 6.0 控件和 .NET 控件的区别

    Visual Basic 6.0 控件和 .NET 控件的区别 升级到 Microsoft .NET Paul D. SheriffPDSA, Inc. 2001年11月 摘要:本文简单介绍了 Microsoft Visual Basic 6.0 中的标准控件和等效的 Microsoft .NET 控件。目标了解哪些 Visual Basic 6.0 ActiveX 控件在 .

  • VB 实现VC TAbControl控件

    VB实现VC TabControl控件 新建一个工程文件Project1,  在左侧工具栏中点右键  在出现的选项中点“Components”,在打开窗口中找到“Controls”选项也中的“Microsoft Tabbed Dialog Control 6.0”,然后点“应用”“确定”退出该页面 此时,在工具栏的右下角会出现刚添加的组件SSTab 

  • 动态数据交换(DDE, Dynamic Data Exchange)简介

    动态数据交换(DDE, Dynamic Data Exchange)简介 1、简介   DDE是一种动态数据交换机制(Dynamic Data Exchange,DDE)。使用DDE通讯需要两个Windows应用程序,其中一个作为服务器处理信息,另外一个作为客户机从服务器获得信息。客户机应用程序向当前所激活的服务器应用程序发送一条消息请求信息,服务器应用程序根据该信息作出应答,...

  • 工控软件中的数据交换利器——DDE服务器与DDE客户端详解

    首先,DDE协议是基于消息传递的,因此在数据交换量较大的情况下,性能可能会受到影响。因此,在使用DDE技术进行数据交换时,需要注意安全性的问题,并采取相应的保护措施。通过DDE技术,工控软件可以读取其他系统的数据,或者其他系统可以读取工控软件的数据,这对于数据传递和交互至关重要。综上所述,DDE Server和DDE Client作为一种常见的数据交换技术,在工控系统中仍然发挥着重要的作用。某些时候工控软件读取其它系统的数据或者其他系统要读取工控软件的数据,这种技术还是能帮上大忙的。

  • ASP.Net的6大热点问题

    1 ASP.Net是什么?      ASP.Net是建立在微软新一代.Net平台架构上,利用普通语言运行时(Common Language Runtime)在服务器后端为用户提供建立强大的企业级Web应用服务的编程框架。      2.ASP.Net与ASP的联系和主要区别是什么?      ASP.Net与现存的ASP保持语法兼容,实际上我们可将现有的ASP源码文件扩展名“.asp”改为“.a

  • VB和VB.NET的大致区别

    Visual Basic .NET是Microsoft Visual Studio .NET套件中主要组成部分之一。.NET版本的Visual Basic增加了更多特性,而且演化为完全面向对象(就像C++)的编程语言。本文将介绍VB.NET的新特性,并比较VB6.0/VB.NET之间的区别,阐述如何利用VB.NET编写简单的应用程序。1.1 什么是 VB.NET? VB.NET是VB6.0的后

  • Visual Basic(VB)6.0安装教程零基础入门到精通,看看完这一篇就够了

    提取码:22331.右击软件压缩包,选择解压到“VB6.0”2.打开visual basic 6.0文件夹。3.双击打开SETUP.EXE,然后选择运行程序。4.点击下一步。5.选择接受协议,点击下一步。6.输入产品的ID号:111-111111,其他随便填,点击下一步。7.点击下一步。

  • Visual Basic6.0学习手册(持续更新版~~)---对口计算机

    学习VB6.0的学习笔记,内容详细,适合计算机对口考生或自学者使用

  • Visual Basic 窗体和常用控件

    此函数的作用是打开一个对话框,等待用户选择一个按钮作为回答,函数的返回值为用户选择的按钮的值。应用MsgBox函数时最主要是确定第2个参数,该参数共有4组,即为4项参数之和“按钮数目值”+“图标类型值”+“默认按钮值”+“模式值”,有两种取法,一种是直接用4个取值相加,另一种是4个内部常量相加。是一个容器控件,用于将窗体上的对象分组。ListIndex属性的值为当前选中的列表项的索引值,0表示选中第一个列表框,-1表示未选中任何列表项,该属性不出现在属性窗口中,是只读属性,只能在程序运行时引用。...

  • VB6.0 ActiveX 控件开发详解 [第三章:属性的设计,属性映射,属性的初始化,属性的保存]

    第三章:属性的设计,属性映射,属性的初始化,属性的保存 第一节:属性的设计        废话不多说,前文再续,书接上一回。上回说到,如何对界面进行布置和写动态修改控件大小的代码;这一回,我来介绍一下如何设计属性,这是难点。        启动我们上次做好的工程,我们需要想想,我们这个控件需要些什么属性?既然是图片框架控件,那么我们就需要一个Picture属性,同时,在以前的代码里,没有调整

  • Visual Basic.net还是C# ——如何选择.net语言

                            Visual Basic.net还是C#                                                ——如何选择.net语言         在.net中,如何选择VB或C#?这似乎已经争论了很久。很多人盲目选择,也产生了许多流言和错误。本文将从以下方面指导你选择正确的开发语言。 功能上的考虑 许多人认为C#的功能

  • C# 代码保护,加壳,混淆,加密 工具 IntelliLock 1.7 Cracked 最新版

    C# 代码保护,加壳,混淆,加密 工具 IntelliLock 1.7 Cracked 最新版

  • Visual Basic控件使用大全

    VB控件使用大全VB控件使用大全VB控件使用大全VB控件使用大全

  • code advisor for visual basic 6

    code advisor for visual basic 6.exe用于VB6编程的评估。

  • VB6中可提高效率的几个自定义函数

    获取扩展名,列名字符和数字的转换等自定义函数

  • IntelliLock v1.5.6.0中文特别版(.net加锁混淆授权保护

    IntelliLock 1.5.6.0 老朽痴作汉化修正版,唯一能创建保护的中文特别版.可适用于未加壳加密未混淆未抑制保护的.net2程序集加锁混淆授权保护. IntelliLock 是一个能用于控件与应用程序许可授权的100%的高级托管解决方案。IntelliLock 和 .NET Reactor 同属 EZIRIZ 公司出品的 .NET 程序集加密保护系统,相对于.NET Reactor提供的基于源代码保护的授权许可系统不同,IntelliLock选择了以100%托管的方式应用许可与保护功能。以这种方式可以产生单个文件,用户可无需使用附加文件. 由于IntelliLock 专业性和保护性较强,汉化相对繁琐,所以多有不妥勿吝赐教.如你感觉到能用就请给个回评...

  • 简要分析VB6.0和VB.NET区别

    现在随着VB.NET的发展,大部分人都放弃使用VB6.0而选择VB.NET,下面我们就来研究一下VB6.0和VB.NET的区别。VB.NET是微软公司在2002年推出的一种开发基于.Net平台应用程序的开发语言,也是微软公司极力推荐的一种开发.Net平台应用程序的开发语言。首先还是让我们来简单了解一下VB.NET和其前一个版本,也是目前世界上拥有最多使用者的开发语言--VB 6.0的主要区别。 ...

  • Visual Basic 基本控件属性说明之一二

    Label控件Label 控件主要用于在窗体中显示提示信息,常与Text控件一起使用。 属性: Caption 表示标签的内容。例:Label1.Caption="N&ame:"控件在窗体中显示Name:,&号跟的字母是快捷键字母,即当我们按下Alt+A时,Label1的Click事件将会发生。这种快捷键定义方法对于菜单和许多其它控件同样适用。 Font 表示控

  • VB.NET与VB6.0的区别

    VB.NET的视频已经看完了,虽说是VB.NET视频,但是大部分讲的是.NET平台。其实VB.NET就是VB6.0与C#的结合体,VB6.0的语法加上C#的思想。         一、整体                  二、具体         2.1 什么是 VB.NET?  VB.NET是VB6.0的后续版本。Microsoft推出全新的编程和操作系统Framework—

Global site tag (gtag.js) - Google Analytics