acl 3.5.0 发布,跨平台网络通信与服务器开发框架-程序员宅基地

技术标签: 网络  json  c/c++  

acl 包括以下丰富的常用函数库:
1、服务器框架:包括进程池模式、线程池模式、非阻塞模式、UDP通信模式、触发器模式以及协程模式
2、网络通信库:阻塞/非阻塞网络 IO 库(其中 lib_acl_cpp 库通过嵌入 polarssl 而具备了 SSL 通信能力)
3、HTTP 网络库:HTTP 客户端/服务端库,HTTP 服务端支持 HttpServlet 接口访问方式;支持 HTTP cookies/session;HTTP 客户端支持连接池及连接池集群;支持 Websocket
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 模式在底层通过上下文切换和事件触发方式转变为非阻塞模式,从而方便程序员快速编写高并发、高性能的网络服务
12、支持将 C++ struct 对象序列化与反序列化(序列化为 Json 对象及由 Json 对象反序列化)

示例:
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/master: 该目录为 acl 服务容器(acl_master)及常用工具
2、app/redis_tools: 该目录下为 redis 集群管理、监控及智能创建工具
3、app/wizard:用来自动生成 acl 服务器框架的向导程序
4、app/master_dispatch:用于管理和分发客户端连接的服务程序
5、app/gid:用来产生全局唯一整型 ID 的服务程序及客户端库
6、app/wizard_demo:为一些服务器测试程序
7、app/gson:json 序列化及反序列化代码生成工具

本次升级为大版本升级,主要有以下改进:
1、网络协程库功能更加丰富、更加稳定,具备应用于复杂业务场景的能力;
2、完全支持 IPV6,内部自动识别 IPV4/IPV6 环境并自动适配;
3、Redis 客户端库支持 Redis5 stream 功能;
4、支持使用 Android Studio 3.3.2。
此外,还包括大量的新功能特性及问题修复。具体内容如下:

一、基础 C 库:lib_acl
.feature: acl_scan_dir.c 在扫描过程中为每个目录添加目录属性,以便于应用可以获得目录的访问时间等属性
.feature: acl_scan_dir.c 中在扫描目录过程中,如果遇到出错情况则会继续扫描下一个,以免提前结束扫描
.feature: acl_scan_dir.c 增加扫描过程中删除空目录功能,例子参照:scan_rmdir
.feature: acl_udp_server.c 增加配置项 udp_fatal_on_bind_err 来决定当无法绑定地址时,进程是否需要自动崩溃
.feature: acl_aio_server.c, acl_single_server.c, acl_threads_server.c, acl_trigger_server.c, acl_udp_server.c 支持进程崩溃时所产生 core 文件的大小,以及进程退出前可禁止产生 core 文件
.feature: acl_udp_server.c 可以通过配置项 master_reuseport 决定是否需要绑定地址
.feature: acl_bind_udp() 在绑定 UNIX 域套接口时不再需要有 @udp 后缀,内部会自动进行判断是否是 UNIX 域套接口
.feature: 新增函数 acl_socket_alive 用来检测所给套接字是否正常
.feature: 当创建监听套接口时通过新增标志位 ACL_INET_FLAG_EXCLUSIVE 来控制是否禁止地址复用,默认是允许地址复用
.feature: acl_cache2.c 中 acl_cache2_enter 在添加新元素时,如果缓冲区满则按 LRU 算法将最老的元素删除,以保证缓冲区空间大小
.feature: 网络通信及域名解析全面支持 IPV6!

.bugfix: acl_threads_server.c,在 client_wakeup() 中调用 acl_access_permit() 时如果该函数返回 0 后再调用 ctx->serv_close() 时会导致服务崩溃,原因是调用 serv_close 中的参数顺序不对
.bugfix: acl_udp_server.c 中 server_binding 绑定失败时不应放在事件监控中
.bugfix: acl_json_utio.c, acl_json_build() 当数组成员为字符串类型时,应允许空串的存在
.bugfix: acl_udp_server.c, server_open() 在打开多个流对象时未将数组索引递增,导致无法绑定多个地址
.bugfix: acl_inet_connect.c 中 acl_inet_connect_ex 函数不支持地址为域名
.bugfix: acl_host_port.c 中不支持只有 port 的解析方式
.bugfix: acl_cache2.c 中 acl_cache2_update 的过期时间添加有误
.bugfix: acl_ifconf.c 中的 acl_ifconf_search 修正几处地址匹配模式问题
.bugfix: acl_json_parse.c 在分析 Json 数据时,针对字符串对象,如果字符串值的开始部分为空格,则会被过滤掉,此问题已修复
.bugfix: acl_json_parse.c 不能处理空数组的情况
.bugfix: acl_write_wait.c 中使用 poll 方法时,针对 POLLHUP, POLLERR 应直接返回正常,让 write 函数触发异常行为

二、基础网络协议库:lib_protocol

三、c++ 库:lib_acl_cpp
.feature: scan_dir.cpp 增加删除空目录功能
.feature: thread::start() 增加同步启动线程的控制参数;在异步创建线程时,如果创建者想通过 thread::thread_id() 获得新线程的线程 ID 号时,原来的方式还有等待过程导致 1 秒延迟返回,现在通过 tbox 方式可以"立即"获得线程 ID 号
.feature: http_request/http_client 类以 socket_stream 为参数的构造方法中,增加控制参数 stream_fixed,决定当对象销毁时是否自动将 socket_stream 对象一起销毁
.feature: connect_pool 支持放置非自己创建的连接对象,同时支持在 peek 连接时,仅从已有的连接中提取而不是创建新的连接
.feature: connect_manager 连接池管理器可以更好地支持协程的多线程模式,使用者仅需调用 connect_manager::bind_thread(true) 即可
.feature: redis_stream 功能模块支持 Redis5 stream 功能
.feature: master_thread.cpp 增加 task_qlen() 方便用户获得当前线程池任务队列中积压的任务数; 增 threads_pool() 方法用来获得 lib_acl C 库中的线程池句柄
.feature: redis_client, redis_client_pool 在非集群模式下创建连接时自动选择db
.feature: websocket::send_frame_data 在被循环调用时需检查长度是否一致,且需要根据实际写入的帧长度设置掩码
.feature: server_socket 构造方法分开多个,避免使用时产生歧义
.feature: master_udp 增加 proc_on_unbind 虚方法,用于当套接口关闭前的回调
.feature: acl::string 添加 end_with 方法
.feature: server_socket 类的构造函数中新增标志位 OPEN_FLAG_EXCLUSIVE 用来控制创建监听套接口是否禁止地址复用,缺省是允许地址复用
.feature: acl::socket_stream 增加 sock_type 来判断 socket 类型
.feature: 添加 sqlite_cursor 类,从而使 db_sqlite 支持 Sqlite 游标功能
.feature: 添加 token_tree 类,该类封装了 C 版的 256 叉匹配树算法
.feature: tbox 模板类允许传递空消息对象
.feature: acl::string 支持更多与 std::string 之间的互相操作
.feature: acl::fstream 增加文件锁方法
.feature: tbox 类完全由 C++ 模板类实现,不再依赖于 C 版中的消息队列,代码更简洁清晰
.feature: thread_cond 类中的 wait 方法参加参数 locked,内部会先判断该参数决定是否需要加锁
.feature: connect_monitor 类增加三个虚方法:on_connected, on_refused, on_timeout
.feature: redis_client_cluster 增加新方法 get_password/get_passwords
.feature: connect_manager 增加 check_idle 用来检测并释放过期空闲连接

.bugfix: scan_dir.cpp 当扫描的节点为目录时给的路径有误
.bugfix: connect_manager::check_idle() 当 pools_size 为 0 时应该直接返回
.bugfix: websocket::read_frame_data 被循环调用时,掩码使用方式有误
.bugfix: WebSocketServlet.cpp 中有多个成员变量未初始化
.bugfix: master_aio/master_threads 在添加 server_socket 时,应该加锁
.bugfix: master_udp::service_on_bind 被多线程同时调用时,需要对成员变量 sstream_ 加锁保护
.bugfix: db_mysql.cpp, 如果在执行操作的时候,发现跟mysql已经断开链接了,就会重连,万一在连接时间内都没有重连成功,就会释放掉MYSQL*指针,造成这个连接对象永不可用了。因为dbmysql::sane_mysql_query函数判断conn_为null就直接返回了
--- young_hb
.bugfix: gson_helper.ipp 在处理空数组时有误
.bugfix: json 序列化工具对 double/float 类型且值不带小数部分时的支持不够完善,通过在 acl::json_node::is_double 增加针对整数的支持得以解决
.bugfix: acl::HttpServlet 当 session 对象内部创建时,需在析构函数里将其释放,否则会造成内存泄露
.bugfix: acl::thread 线程对象被创建时,默认采用非分离状态,以便于和操作系统的 API 行为相近,原来采用的是分离状态
.bugfix: redis_key::renamenx 返回值类型有误

四、网络协程库:lib_fiber
.feature: 增加 tcp_keeper 类用来预创建 TCP 连接及连接保持,减少 TCP 三次握手造成的时延影响
.feature: 添加 fiber_cond.c 可用于协程和线程之间的条件变量
.feature: fiber_event.c 增加控制参数,可用于协程之间、线程之间及协程与线程之间的互斥
.feature: fiber_server.c 支持所生成 core 文件的大小及进程退出时不产生 core
.feature: 增加 fiber_tbox 类,可以在协程之间、线程之间及协程与线程之间传递对象

.bugfix: acl_fiber_cond.c 中 acl_fiber_cond_timedwait 和 acl_fiber_cond_wait 在释放 fbase 对象时,必须在调用 acl_fiber_event_wait 之前,否则会引起句柄被
提前关闭问题
.bugfix: acl_fiber_cond.c 中如果多个线程调用同一个条件变量的的 acl_fiber_cond_timedwait 方法时,可能会存在超时值失效的情况
.bugfix: fiber_server.cpp 当有连接未断开时,进程无法正常退出
.bugfix: fbase_event.c 中 fbase_event_wakeup/fbase_event_wait IO 如果遇到中断信号,应该需要重启 IO 过程
.bugfix: fiber_event.c 的方法 acl_fiber_event_notify 中需要用线程锁对等待队列(event->waiters)和原子数(event->atomic)进行保护,否则中间会有时间间隙,导致加锁等待者(调用acl_fiber_event_wait)永久等待
.bugfix: fiber_event.c 修复锁竞争问题
.bugfix: fiber_event.c 中的锁存在几处锁竞争失效问题
.bugfix: event_iocp.c 中的 iocp_check 方法中的一处断言有问题 -- [email protected]
.bugfix: getaddrinfo.c 修复一处 IPV6 相关问题
.bugfix: 使用 poll 方法时,在初始化参数时不需要设置 POLLERR, POLLHUP
.bugfix: acl_fiber_gethostbyname 在协程模式下是不安全的,会存在多个协程共用一个线程局部变量的问题,从而导致内存解析失败,解决方式是使用协程局部变量

软件下载链接:https://gitee.com/acl-dev/acl

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_33922670/article/details/89721904

智能推荐

5个超厉害的资源搜索网站,每一款都可以让你的资源满满!_最全资源搜索引擎-程序员宅基地

文章浏览阅读1.6w次,点赞8次,收藏41次。生活中我们无时不刻不都要在网站搜索资源,但就是缺少一个趁手的资源搜索网站,如果有一个比较好的资源搜索网站可以帮助我们节省一大半时间!今天小编在这里为大家分享5款超厉害的资源搜索网站,每一款都可以让你的资源丰富精彩!网盘传奇一款最有效的网盘资源搜索网站你还在为找网站里面的资源而烦恼找不到什么合适的工具而烦恼吗?这款网站传奇网站汇聚了4853w个资源,并且它每一天都会持续更新资源;..._最全资源搜索引擎

Book类的设计(Java)_6-1 book类的设计java-程序员宅基地

文章浏览阅读4.5k次,点赞5次,收藏18次。阅读测试程序,设计一个Book类。函数接口定义:class Book{}该类有 四个私有属性 分别是 书籍名称、 价格、 作者、 出版年份,以及相应的set 与get方法;该类有一个含有四个参数的构造方法,这四个参数依次是 书籍名称、 价格、 作者、 出版年份 。裁判测试程序样例:import java.util.*;public class Main { public static void main(String[] args) { List <Book>_6-1 book类的设计java

基于微信小程序的校园导航小程序设计与实现_校园导航微信小程序系统的设计与实现-程序员宅基地

文章浏览阅读613次,点赞28次,收藏27次。相比于以前的传统手工管理方式,智能化的管理方式可以大幅降低学校的运营人员成本,实现了校园导航的标准化、制度化、程序化的管理,有效地防止了校园导航的随意管理,提高了信息的处理速度和精确度,能够及时、准确地查询和修正建筑速看等信息。课题主要采用微信小程序、SpringBoot架构技术,前端以小程序页面呈现给学生,结合后台java语言使页面更加完善,后台使用MySQL数据库进行数据存储。微信小程序主要包括学生信息、校园简介、建筑速看、系统信息等功能,从而实现智能化的管理方式,提高工作效率。

有状态和无状态登录

传统上用户登陆状态会以 Session 的形式保存在服务器上,而 Session ID 则保存在前端的 Cookie 中;而使用 JWT 以后,用户的认证信息将会以 Token 的形式保存在前端,服务器不需要保存任何的用户状态,这也就是为什么 JWT 被称为无状态登陆的原因,无状态登陆最大的优势就是完美支持分布式部署,可以使用一个 Token 发送给不同的服务器,而所有的服务器都会返回同样的结果。有状态和无状态最大的区别就是服务端会不会保存客户端的信息。

九大角度全方位对比Android、iOS开发_ios 开发角度-程序员宅基地

文章浏览阅读784次。发表于10小时前| 2674次阅读| 来源TechCrunch| 19 条评论| 作者Jon EvansiOSAndroid应用开发产品编程语言JavaObjective-C摘要:即便Android市场份额已经超过80%,对于开发者来说,使用哪一个平台做开发仍然很难选择。本文从开发环境、配置、UX设计、语言、API、网络、分享、碎片化、发布等九个方面把Android和iOS_ios 开发角度

搜索引擎的发展历史

搜索引擎的发展历史可以追溯到20世纪90年代初,随着互联网的快速发展和信息量的急剧增加,人们开始感受到了获取和管理信息的挑战。这些阶段展示了搜索引擎在技术和商业模式上的不断演进,以满足用户对信息获取的不断增长的需求。

随便推点

控制对象的特性_控制对象特性-程序员宅基地

文章浏览阅读990次。对象特性是指控制对象的输出参数和输入参数之间的相互作用规律。放大系数K描述控制对象特性的静态特性参数。它的意义是:输出量的变化量和输入量的变化量之比。时间常数T当输入量发生变化后,所引起输出量变化的快慢。(动态参数) ..._控制对象特性

FRP搭建内网穿透(亲测有效)_locyanfrp-程序员宅基地

文章浏览阅读5.7w次,点赞50次,收藏276次。FRP搭建内网穿透1.概述:frp可以通过有公网IP的的服务器将内网的主机暴露给互联网,从而实现通过外网能直接访问到内网主机;frp有服务端和客户端,服务端需要装在有公网ip的服务器上,客户端装在内网主机上。2.简单的图解:3.准备工作:1.一个域名(www.test.xyz)2.一台有公网IP的服务器(阿里云、腾讯云等都行)3.一台内网主机4.下载frp,选择适合的版本下载解压如下:我这里服务器端和客户端都放在了/usr/local/frp/目录下4.执行命令# 服务器端给执_locyanfrp

UVA 12534 - Binary Matrix 2 (网络流‘最小费用最大流’ZKW)_uva12534-程序员宅基地

文章浏览阅读687次。题目:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=93745#problem/A题意:给出r*c的01矩阵,可以翻转格子使得0表成1,1变成0,求出最小的步数使得每一行中1的个数相等,每一列中1的个数相等。思路:网络流。容量可以保证每一行和每一列的1的个数相等,费用可以算出最小步数。行向列建边,如果该格子是_uva12534

免费SSL证书_csdn alphassl免费申请-程序员宅基地

文章浏览阅读504次。1、Let's Encrypt 90天,支持泛域名2、Buypass:https://www.buypass.com/ssl/resources/go-ssl-technical-specification6个月,单域名3、AlwaysOnSLL:https://alwaysonssl.com/ 1年,单域名 可参考蜗牛(wn789)4、TrustAsia5、Alpha..._csdn alphassl免费申请

测试算法的性能(以选择排序为例)_算法性能测试-程序员宅基地

文章浏览阅读1.6k次。测试算法的性能 很多时候我们需要对算法的性能进行测试,最简单的方式是看算法在特定的数据集上的执行时间,简单的测试算法性能的函数实现见testSort()。【思想】:用clock_t计算某排序算法所需的时间,(endTime - startTime)/ CLOCKS_PER_SEC来表示执行了多少秒。【关于宏CLOCKS_PER_SEC】:以下摘自百度百科,“CLOCKS_PE_算法性能测试

Lane Detection_lanedetectionlite-程序员宅基地

文章浏览阅读1.2k次。fromhttps://towardsdatascience.com/finding-lane-lines-simple-pipeline-for-lane-detection-d02b62e7572bIdentifying lanes of the road is very common task that human driver performs. This is important ..._lanedetectionlite

推荐文章

热门文章

相关标签