acl.3.4.0
版本发布时间: 2018-04-29 21:15:03
acl-dev/acl最新发布版本:v3.6.1-7(2024-03-16 16:24:16)
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、重构网络协程库,支持更多的操作系统平台(Linux/FreeBSD/MacOS/Windows),且支持更多网络事件引擎:epoll/select/poll/kqueue/iocp/Win32 GUI; 2、acl 服务容器从基础库中独立出来,形成独立的模块; 此外,还包括大量的新功能特性及问题修复。具体内容如下:
一、基础 C 库:lib_acl .feature: feature: 提供 socket IO 读写注册接口,允许使用者注册 IO 过程,从而使 ACL_VSTREAM 流针对网络 IO 的读写过程使用用户注册的 API 过程 .feature:aio 模块增加 acl_aio_last_nready,event 模块增加 acl_event_last_nready 用来表明一次事件循环被触发的事件次数 .feature: acl_mbox.c 支持采用 eventfd 句柄进行 IO 通知 .feature: acl_udp_server.c 支持绑定 UNIX 域套接口 .feature: net 中的 udp 模块支持绑定 UNIX 域套接口传输数据 .feature: acl_argv.c 增加 acl_argv_set 用于替换指定下标位置的值 .feature: acl_udp_server.c 支持 IP 地址自动发现功能,即当网卡地址发生变化时,会自动添加或删除监听的地址 .feature: acl_dlink.c 二分块算法支持添加负整数 .feature: master 服务器模板支持收到 SIGTERM 信号后的后续处理过程 .feature: acl_mbox.c 中的 acl_mbox_read 函数读超时单位由秒级调整为毫秒级 .feature: 开放 acl_read_xxx_wait 接口,以允许毫秒级读超时等待 .feature: acl_inet_listen/acl_inet_bind/acl_vstream_listen_ex 增 flag 标志位 .feature: master 服务器框架及服务器模板增加配置项 master_reuseport 及 master_nonblock,master_fastopen 以允许用户可以通过配置文件来设置监听方式 .feature: acl_udp_server.c/acl_threads_server.c/acl_aio_server.c, acl_single_server.c/acl_trigger_server.c,增加方法用于获得当前服务的配置文件路径 .feature: master/template/acl_udp_server.c 增加配置项,允许创建的线程为非“分离”模式 .feature: master/template 下所有服务器模板支持获得 SIGHUP 信号后的回调过程 .feature: event_kernel.c 中的函数 event_new_kernel 增加 acl_close_on_exec 控制,防止子进程继承 epoll/devpoll/kqueue 句柄 .feature: 增加 acl_sane_bind.c 文件,将地址绑定操作形成单独的方法 .feature: 增加 acl_host_addrinfo 方法,支持通用的域名解析 .feature: acl_udp_server.c 支持 daemon 及 alone 两种运行模式 .feature: acl_udp_server.c 支持绑定模糊匹配的地址 .feature: acl_master 服务器框架允许启动时没有应用服务程序,以便于用户动态添加 .feature: ACL_TOKEN 对象增加针对 acl_foreach 的支持,可以遍历所有的关键词 .feature: acl_token_tree.c 增加 acl_token_tree_word_remove 方法 .feature: acl_master 支持 UDP 方式下的 SO_REUSEPORT .feature: acl_master 服务器框架支持在 fork 子进程后, execvp 应用程序前切换子进程运行身份,此功能将帮助使用 go 语言编写的应用服务切换运行身份。 .feature: add inet_ntop/inet_pton for vc2003
.bugfix: acl_xml_parse.c 宏 IS_CDATA 判断有误,--- by https://gitee.com/ghostshy .bugfix: acl_read_wait.c 在调用 epoll 前无需设置 EPOLLHUP | EPOLLERR 标志,该标志属于返回值 .bugfix: acl_inet_connect.c 当连接失败时因为调用了 acl_socket_close 在 WIN 平台上会重置系统错误号 .bugfix: acl_read_wait.c/acl_write_wait.c 调用 poll API 时,POLLHUP | POLLERR 不应做为输入参数 .bugfix: 当用 acl_vstream_fdopen 打开文件时,不应再判断是否是 SOCKET 类型,否则会将文件句柄类型当作 SOCKET 类型,从而引发问题 .bugfix: 重构 acl_ifconf.c 中的函数 acl_ifconf_search,该函数存在一些兼容性问题 .bugfix: 修复 acl_udp_server.c 中网卡 IP 地址变化自我感知问题 .bugfix: acl_ifconf_search 配置地址时有误 .bugfix: acl_mylog.c 当 fork 子进程时,可能会造成死锁问题 .bugfix: acl_events.c 中 event_init 函数 eventp->timer_keep 为函数指针,不应设为 0,否则会引起 acl_event_keep_timer 函数崩溃 .bugfix: acl_udp_server.c 当收到 SIGHUP 信号后通过管道反馈给 acl_master 时,所传递的进程号有误 .bugfix: acl_dlink.c 二分块算法当添加两个连续的数据块时,应该进行合并 .bugfix: acl_mylog.c 内部的线程锁采用递归锁,否则,当记日志时收到信号再记日志时会造成死锁 .bugfix: acl_aqueue.c 中的 acl_aqueue_pop_timedwait 函数计算超时时间方式有误 .bugfix: acl_host_port.c->host_port 在 windows 平台下的解析有误 .bugfix: acl_aio_server.c/acl_threads_server.c 在 windows 下有误 .bugfix: acl_threads_server.c 中 thread_callback 在调用回调函数 serv_timeout 时的参数顺序是错误的。 .bugfix: acl_atomic_int64_fetch_add/acl_atomic_int64_add_fetch 实现有问题 .bugfix: acl_master 当 master_prefork > 0 时,若停止一个服务模块或将该服务模块的监听地址改变后 reload acl_master 则 acl_master 会产生崩溃,该问题 已经修复 .bugfix: acl_pthread.c 中 acl_pthread_setspecific 存在 bug .bugfix: acl_mylog.c/private_stream.c 中的内存存在非法释放
二、基础网络协议库:lib_protocol .feature: 针对 HTTP 请求 uri 中的 "?" 问号被转义成 "%3F" 的情况,可以做兼容性处理 .feature: http_hdr_res.c 中的函数 http_hdr_res_parse 取消了对 http_status 的检查,以便于应用使用自定义状态码
三、c++ 库:lib_acl_cpp .feature: 针对 HTTP 请求 uri 中的 "?" 问号被转义成 "%3F" 的情况,可以做兼容性处理 .feature: 添加 diff_xxx 类对象集,用来快速对比两个集合的差集 .feature: atomic_long 类增加赋值拷贝重载功能,同时禁止构造拷贝功能 .feature: 添加 redis_role、redis_sentinel 类 .feature: server_socket 类支持 SO_REUSEPORT .feature: aio_handle 类增加方法 last_nready 用来获得本次事件循环触发的事件数 .feature: redis_cluster 功能类支持 redis.4.x.x .feature: 增加 tbox 类,用于在多线程环境中传递消息对象 .feature: 添加新类 event_mutex,该类以原子操作 + IO 事件方式支持线程级或协程级的互斥功能 .feature: thread_mutex 将是否创建递归锁做为构造参数选项 .feature: 增加 trigger.hpp 文件,用于按时间进行定时触发操作 .feature: 在 stdlib/ 目录下新增 bitmap 类,用于位映射操作 .feature: 增加原子操作类 atomic .feature: 增加了 tcp 连接池通信模块 .feature: polarssl_conf & polarssl_io 两个类支持动态加载 polarssl 动态库 .feature: redis_hash 类针对 hmset 方法增加几种实现,以方便用户使用 .feature: master_proc/master_aio/master_threads/master_udp/master_trigger 增加 get_conf_path 方法用于获得当前服务器的配置文件路径 .feature: 所有服务器模板支持 SIGHUP 信号回调处理过程 .feature: db_sqlite 类增加了事务处理接口 --- by lindawei 672496008@qq.com .feature: 添加 WebSocketServlet by "fuwangqin" niukey@qq.com .feature: ostream::write 支持缓冲式写数据 .feature: db_pgsql.cpp 支持以 UNIX 域套接口方式连接 postgresql 数据库 .feature: 增加针对 postgreqsl 的支持
.bugfix: acl::thread 对象被重复使用时(即线程退出后再次调用 start),需要将 thread_id_ 置 0 --- by 562351190@qq.com .bugfix: thread_cond.cpp 中的方法 wait 内部计算时间有误 .bugfix: serialize/gsoner.cpp 针对 std::map 类型的数据对象不支持 optional .bugfix: server_socket 中的 buf_ 为固定 64 字节大小,对于 UNIX 域套接口是不够用的,将其类型改为 acl::string .bugfix: redis_client.cpp 中当连接需要认证时,如果因网络或其它原因可能会造成认证死循环状态,通过增加标志位成员(authing_) 以防止循环认证 .bugfix: redis_client_cluster::set_all_slot 方法不支持连接认证功能 .bugfix: polarssl_conf.cpp 将库的初始化放在构造函数之外,以应对应用不同的使用方式 .bugfix: redis 模块中有些命令类对于二进制的数据支持存在问题 .bugfix: polarssl_conf.cpp 在动态加载 polarssl 库时,如果应用定义了全局的 acl::polarssl_conf 对象,则会因 polarssl_conf 类内部的 __polarssl_path 也是静态全局的,编译器在构建此两个对象时的顺序是先构造应用的 polarssl_conf 对象而后构造 polarssl_path,从而导致 polarssl_conf 在构造时会引起崩溃 .bugfix: string.cpp 中在重载 < 和 > 符号时,应取最小长度值进行比较,但 内部却误写成取最长长度进行比较,容易造成内存非法访问 .bugfix: redis_hash.cpp 中当调用 hmset 命令时有一处填写了错误的命令字 .bugfix: http_request.cpp 中的 reset 方法应该增加 header.reset() 和 client->reset(),否则会引起内存泄露 .bugfix: websocket::make_frame_header 中当 payload_len 为 126 时会遇到内存跨界问题 --- found by "lindawei" 672496008@qq.com .bugfix: connect_manager::remove 中存在一处删除问题 --- "fuwangqin" niukey@qq.com .bugfix: gson_helper.ipp 中 gson 模板函数中当第二个参数为 std::list 或 std::vector 时,如果容器中元素中的成员为对象指针时会因浅拷贝的原因导致指针对象被二次释放的问题 -- "lindawei" 672496008@qq.com .bugfix: query.cpp 中 escape 在转义时不应对 \r\n 进行转义
四、网络协程库:lib_fiber .feature: acl 协程库可以运行在 MacOS 上了 .feature: fiber_server.cpp 支持协程调度时选择不同的事件引擎 .feature: 协程事件引擎增加针对 Winsock IOCP 的支持 .feature: 增加 API acl_fiber_schedule_init() 可以设置协程调度器为自启动模式 .feature: 增加 API acl_fiber_schedule_set_event() 可以显式地设置协程事件引擎 .feature: fiber_io.c 当没有监控网络句柄并且没有定时器任务时,该 IO 协程会自动退出 .feature: 协程模块可以支持 WIN32 窗口消息引擎,从而可以与界面编程无缝整合 .feature: acl_fiber_poll/acl_fiber_select 支持 win32 平台 .feature: 增加 kqueue 事件引擎以支持 FreeBSD,从而使 acl 协程支持 FreeBSD .feature: fiber_event.c 新增同时支持协程/线程互斥的锁,性能可达千万级别 QPS .feature: fiber.c, fiber_alloc 中需要增加针对信号的处理过程 .feature: EVENT::poll_list, epoll_list 可以采用 FIFO 或 STACK .feature: hook sendfile/sendfile64 .feature: 添加 C++ 版本的协程定时器类 fiber_timer .feature: fiber_server.c 当在独立运行时也可以通过配置文件指定 master_reuseport 选项 .feature: master_fiber 增加 get_conf_path, acl_fiber_server.cpp 中增加 acl_fiber_server_conf,此二方法用于获得当前的服务配置文件路径 .feature: master/fiber_server.c 中将 fiber_sleep 协程的栈大小允许受配置项控制;同时将内部的 STACK_SIZE 缺省值由 64 K 改为 128 K,该值也是用户级所创建 协程的栈缺省大小 .feature: fiber_server.c/master_fiber.cpp 支持 SIGHUP 信号回调过程 .feature: fiber_server.c 支持多线程运行模式 .feature: fiber_server.c 协程服务器模板增加了平滑退出机制
.bugfix: 当所有协程还未执行完毕而调用 acl_fiber_stop 时,则需要将缓存的协程对象及正在运行的协程对象的内存释放掉 .bugfix: acl_fiber_gethostbyname 在协程模式下是不安全的,会存在多个协程共用一个线程局部变量的问题,从而导致内存解析失败,解决方式是使用协程局部变量 .bugfix: 修复了 FreeBSD kqueue 的问题 .bugfix: event_epoll.c 的 函数 epoll_event_wait 中没有处理 EPOLLERR|EPOLLHUP 的错误情况,会导致程序进入死循环 .bugfix: event_select.c/event_poll.c 当没有网络句柄被监控时,应调用 Sleep,因为 Windows 下的 select/WSAPoll 不允许输入的句柄为空 .bugfix: event_poll.c 中应该处理异常情况(POLLERR | POLLHUP | POLLNVAL) .bugfix: fiber_io.c, fiber_io_loop 中容易产生 32 位整数溢出问题,会导致定时器无法触发 .bugfix: fiber.c,__thread_fiber->switched 原来为有符号 int 型,有可能会因溢出问题造成协程调度出问题