阅读更多

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 6远程协助控件SDK

    远程控制是在网络上由一台电脑(主控端Remote/客户端)远距离去控制另一台电脑(被控端Host/服务器端)的技术。电脑中的远程控制技术,始于DOS时代。远程控制一般支持下面的这些网络方式:LAN、WAN、拨号方式、互联网方式。 控件基于VNC协议并扩展开发。将完整的窗口界面通过网络,传输到另一台计算机的屏幕上。可用于数量庞大的不同操作系统,简单,可靠,和向后兼容性。 Visual Basic 6.0 远程协助控件SDK,含服务端和客户端。

  • 升级到 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

  • .Net6.0系列-1.Net 6及以上知识点整理-基础知识

    文件发布选项:生成单个文件(只生成一个文件,所有文件封装到一个文件里面 *.exe)/启用readyToRun(启动更快,文件更大)选择独立运行时–>目标运行时:分为可移植的(目标电脑安装框架)与具体目标框架(win/linux/osx(苹果系统))项目上右键点击–>发布–>(设置完成路径设置)…–>点击"完成"–>进入发布界面–>点击"编辑"进入发布配置部署模式可选择:依赖框架(运行电脑需要安装)和独立发布(直接复制到目标电脑即可运行)

  • 如何在Visual Studio中安装.net6.0 或者 将在Visual Studio中将.net 5.0更新为6.0

    找到“目标框架”字段,并从下拉列表中选择“.net 6.0”。2.在弹出的窗口中,选择“单个组件”选项卡并勾选“ .net 6.0开发人员工具”复选框。在“预览功能”页面中,找到“.net sdk 的使用情况”选项,并勾选它。4.等待安装完成后,您可以启动新的.net 6.0项目并开始使用它。点击顶部菜单栏中的“工具”选项,再点击下拉菜单里的 “选项”。在弹出的窗口中,选择“环境”节点,然后选择“预览功能”子节点。点击顶部菜单栏中的“项目”选项,然后选择“属性”。在“项目属性”窗口中,选择“应用”选项卡。

  • .Net 6.0定义全局当前身份缓存对象

    我们登录后一些必要的用户数据存到Token中,我们只需要在请求头中拿到Token并将它解析出来,再通过数据库查询出来即可,做的好一点可以配合上Redis,但是不用Redis也无伤大雅,当然也会遇到一些小问题,比如HttpContext对象如何获取,我在这里的解决方案是,定义一个静态类然后在请求管道中拿到服务容器,再通过服务容器拿到IHttpContextAccessor服务,再点出HttpContext,再拿到请求头,是不是很简单,那我们就直接步入正题吧!!!各位看官献丑了哈哈哈哈。

  • 【后端】Core框架版本和发布时间以及.net 6.0启动文件的结构

    2023年,第35周,第1篇文章。给自己一个目标,然后坚持总会有收货,不信你试试! .NET Core 是一个跨平台的开源框架,用于构建现代化的应用程序。它在不同版本中有一些重要的区别和发布时间

  • .NET微服务系统迁移至.NET6.0的故事

    那么有很多朋友会有疑问,现在有很多面向云原生的编程语言和框架,我们为什么选择了使用.NET?我想从几个方面解答这个问题。总的来说,本次.NET6.0的迁移还是非常成功的,简单的通过版本升级就能获得性能提升,而且还可以享受新版.NET和C#带给我们新的特性,如果有什么问题请私信或者评论,欢迎交流!

  • 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的后

  • Net6.0或Net7.0项目升级到Net8.0 并 消除.Net8中SqlSugar的警告

    受影响的库: SQLitePCLRaw.lib.e_sqlite3。在 .NET 8.0 及更高版本中,默认情况下找不到特定于版本和特定于发行版的运行时标识符的资产。有关详细信息,请参阅 https://aka.ms/dotnet/rid-usage。我这里有个别包未选择更新,因为有个别包升级后可能有不兼容的或者某些属性方法变更了,导致编译失败,方法或属性找不到,如果不小心升级了,先卸载对应包,再选择对应版本的包安装即可。至此,项目升级完成,希望本文对你有参考价值。

  • 首次运行.Net6.0程序注意事项

    前言 转眼.Net6.0已经发布,对应的开发平台VS2022和C#10都相继发布。首先运行程序时遇到了一些问题,记录不上下来,以便经验备忘。 错误 在编写了HelloWorld程序后,在没有安装.Net6的机器上运行则会报错,如下图所示。 解决 首先访问以下地址: https://dotnet.microsoft.com/download/dotnet/6.0/runtime?utm_source=getdotnetcore&utm_medium=referral 打开后如图所示。 特别注意,现

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

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

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

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

  • VB6和VB.NET的区别

    来源不详。总览: 本文推荐给那些准备将自己的应用移植到Visual Basic.NET中的Visual Basic开发者。文章中包括 Visual Basic.NET升级工具的信息的介绍以及将Visual Basic 6结构平滑升级到Visual Basic.NET 的指导 在打开Visual Basic 6.0工程时Visual Basic.NET会自动升级,但是在绝大多数情况下你需要对在Visual Basic.NET下打开的Visual Basic 6.0程序做一些改动。这篇文章的用途

  • 教你快速在linux服务器上部署net6.0环境

    wnload .NET 6.0 (Linux, macOS, and Windows) (microsoft.com)

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

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

  • code advisor for visual basic 6

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

Global site tag (gtag.js) - Google Analytics