皇上,还记得我吗?我就是1999年那个Linux伊甸园啊-----24小时滚动更新开源资讯,全年无休!

acl 3.5.0 发布,跨平台网络通信与服务器开发框架

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 方法中的一处断言有问题 — program_code@sohu.com
.bugfix: getaddrinfo.c 修复一处 IPV6 相关问题
.bugfix: 使用 poll 方法时,在初始化参数时不需要设置 POLLERR, POLLHUP
.bugfix: acl_fiber_gethostbyname 在协程模式下是不安全的,会存在多个协程共用一个线程局部变量的问题,从而导致内存解析失败,解决方式是使用协程局部变量

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

转自 https://www.oschina.net/news/105030/acl-3-5-0-released