# acl **Repository Path**: acl-dev/acl ## Basic Information - **Project Name**: acl - **Description**: 跨平台网络通信与服务器开发框架;支持 HTTP/MQTT/Redis/Memcache/SMTP/PING/Beanstalk/handler socket 等网络通信协议;支持线程池、协程、进程池、非阻塞、触发器等多种服务器编程模型;支持 XML/JSON/MIME/BASE64/UUCODE/QPCODE/RFC2047 等常见格式编解码;还有其它更多有价值的功能。 - **Primary Language**: C++ - **License**: LGPL-2.1 - **Default Branch**: master - **Homepage**: https://acl-dev.cn/ - **GVP Project**: Yes ## Statistics - **Stars**: 1065 - **Forks**: 415 - **Created**: 2014-09-17 - **Last Updated**: 2026-01-01 ## Categories & Tags **Categories**: web-dev-toolkits **Tags**: None ## README [English](README.md) # Acl -- 强大的跨平台 C/C++ 网络通信库与服务框架 # 0. 关于 Acl 项目 Acl(Advanced C/C++ Library,先进的 C/C++ 库)是一个功能强大的跨平台网络通信库和服务器编程框架,支持 Linux、Windows、Solaris、FreeBSD、macOS、Android、iOS 及鸿蒙系统。众多基于 Acl 开发的应用程序运行在各类设备上,为上亿用户提供稳定可靠的服务。 Acl 项目包含丰富的功能模块:网络通信、服务器框架、应用协议、多种编解码器等。内置实现了常用网络协议,如 HTTP/SMTP/ICMP/MQTT/Redis/Memcached/Beanstalk/Handler Socket 等,以及完整的编解码库,如 XML/JSON/MIME/BASE64/UUCODE/QPCODE/RFC2047/RFC1035 等。此外,Acl 还为主流数据库(MySQL、PostgreSQL、SQLite)提供了统一的抽象接口,让开发者能够更加轻松、快速、安全地编写数据库应用程序。 ## 软件架构图 ![整体架构图](res/img/architecture_en.png)
* [0. 关于 Acl 项目](#0-关于-acl-项目) * [1. 六个核心模块](#1-六个核心模块) * [1.1. 基础网络模块](#11-基础网络模块) * [1.2. 协程](#12-协程) * [1.3. HTTP 模块](#13-http-模块) * [1.4. Redis 客户端](#14-redis-客户端) * [1.5. MQTT 模块](#15-mqtt-模块) * [1.6. 服务器框架](#16-服务器框架) * [2. 其他重要模块](#2-其他重要模块) * [2.1. MIME 模块](#21-mime-模块) * [2.2. 编解码模块](#22-编解码模块) * [2.3. 数据库模块](#23-数据库模块) * [2.4. 连接池管理器](#24-连接池管理器) * [2.5. 其他客户端库](#25-其他客户端库) * [2.6. DNS 模块](#26-dns-模块) * [3. 平台支持和编译](#3-平台支持和编译) * [3.1. 在不同平台上编译 Acl](#31-在不同平台上编译-acl) * [3.2. 在 Windows 上编译的注意事项](#32-在-windows-上编译的注意事项) * [4. 快速开始](#4-快速开始) * [4.1. 第一个 Acl 示例](#41-第一个-acl-示例) * [4.2. 简单的 TCP 服务器](#42-简单的-tcp-服务器) * [4.3. 简单的 TCP 客户端](#43-简单的-tcp-客户端) * [4.4. 协程 TCP 服务器](#44-协程-tcp-服务器) * [4.5. HTTP 客户端示例](#45-http-客户端示例) * [4.6. 协程 HTTP 服务器](#46-协程-http-服务器) * [4.7. Redis 客户端示例](#47-redis-客户端示例) * [5. 更多信息](#5-更多信息) * [5.1. 示例代码](#51-示例代码) * [5.2. 更多简单示例](#52-更多简单示例) * [5.3. 常见问题(FAQ)](#53-常见问题faq) * [5.4. 开源许可证](#54-开源许可证) * [5.5. 相关链接](#55-相关链接) * [5.6. 致谢](#56-致谢) * [6. 附录](#6-附录) * [6.1. 软件分层架构](#61-软件分层架构) * [6.2. 项目目录结构](#62-项目目录结构)
# 1. 六个核心模块 作为一个功能完备的 C/C++ 基础库,Acl 为应用程序开发提供了丰富而实用的功能。其中最核心的六大模块包括:网络通信、协程、HTTP、Redis 客户端、MQTT 和服务器框架。 ## 1.1. 基础网络模块 **流处理模块** 该模块是整个 Acl 网络通信的基石,提供统一的流式通信接口,同时支持网络流和文件流。主要功能包括: - 按行读取数据,自动兼容 Windows 下的 `\r\n` 和 UNIX 下的 `\n` 结尾符 - 按行读取数据并自动删除尾部的换行符(`\n` 或 `\r\n`) - 以自定义字符串分隔符读取数据 - 读取指定长度的数据 - 尝试性读取一行数据或指定长度数据 - 检测网络 IO 状态 - 写入一行数据 - 格式化写入数据(类似于 `fprintf`) - 文件流定位操作(类似于 `fseek`) - 批量写入数据(类似于 UNIX 的 `writev`) - 截断文件(类似于 `ftruncate`) - 获取文件大小和当前文件流指针位置(类似于 `ftell`) - 获取网络流的本地地址和远程地址 **网络操作模块** 该模块提供完整的网络操作功能,包括: - 网络服务器监听(支持 TCP/UDP/UNIX 域套接字) - 网络客户端连接(支持 TCP/UNIX 域套接字) - DNS 域名查询和结果缓存(支持系统 API 调用和直接 DNS 协议两种方式) - 套接字(socket)操作及本地网卡信息获取 **非阻塞网络流** 全面支持非阻塞模式的网络操作,包括非阻塞连接、读取(按行读取、指定长度读取)、写入(按行写入、指定长度写入、批量写入)等。 **常见网络应用协议库** 内置实现了常用网络应用协议,如 HTTP、SMTP、ICMP 等,其中 HTTP 和 ICMP 模块同时支持阻塞和非阻塞通信方式。HTTP 协议在 C++ 版本的 lib_acl_cpp 中提供了服务器端和客户端两种模式: - **服务器端模式**:提供类似 Java HttpServlet 的接口,支持 Cookie、Session、HTTP MIME 文件上传等功能 - **客户端模式**:支持连接池和集群管理、分块传输、自动字符集转换、自动解压缩、断点续传等丰富特性 **常见网络通信库** 提供 Memcached、Beanstalk、Handler Socket 等客户端通信库,均支持连接池模式。 ## 1.2. 协程 Acl 的协程模块是一个成熟稳定的跨平台协程库,已在众多重要项目中得到广泛应用和验证。 **平台支持** - 支持 Linux、macOS、Windows、iOS 和 Android 等主流操作系统 - 支持 x86、ARM 等多种 CPU 架构 - 支持 select/poll/epoll/kqueue/iocp/win32 GUI 消息等多种事件引擎 **核心特性** - **完整的 DNS 协议实现**:DNS 协议已在协程中原生实现,DNS API 可直接在协程中使用 - **系统 API Hook**:在 Unix 和 Windows 平台上自动 Hook 系统 IO API,实现协程化 - **读取 API**:read/readv/recv/recvfrom/recvmsg - **写入 API**:write/writev/send/sendto/sendmsg/sendfile64 - **套接字 API**:socket/listen/accept/connect/setsockopt - **事件 API**:select/poll/epoll_create/epoll_ctl/epoll_wait - **DNS API**:gethostbyname/gethostbyname_r/getaddrinfo/freeaddrinfo - **共享栈模式**:支持共享栈模式,可显著降低内存占用 **同步原语** - **协程互斥锁**和**信号量**:用于协程间同步 - **协程事件**:支持协程与线程间的同步通信 更多详细信息,请参见 **[使用 Acl 协程库](lib_fiber/README_en.md)** ## 1.3. HTTP 模块 完整实现 HTTP/1.1 协议,同时支持客户端和服务器端应用开发。 **主要特性** - **类 Java HttpServlet 接口**(服务器端):提供熟悉的编程接口,降低学习成本 - **连接池模式**(客户端):高效管理连接资源,提升性能 - **分块传输**(Chunked Transfer):支持流式数据传输 - **压缩传输**:内置 Gzip 压缩/解压缩支持 - **SSL/TLS 加密**:支持安全加密传输 - **断点续传**:支持大文件的断点续传功能 - **Cookie 管理**:完整的 Cookie 设置和获取功能 - **Session 管理**(服务器端):内置会话管理机制 - **WebSocket 支持**:支持 WebSocket 协议 - **HTTP MIME 格式**:支持 MIME 多部分数据格式 - **同步/异步模式**:灵活选择通信模式 ## 1.4. Redis 客户端 Acl 的 Redis 客户端模块功能强大、性能卓越且易于使用,是生产环境的理想选择。 **功能特性** - **丰富的命令支持**:支持 Bitmap/String/Hash/List/Set/Sorted Set/PubSub/HyperLogLog/Geo/Script/Stream/Server/Cluster 等 Redis 数据类型和命令 - **STL 风格接口**:为每个 Redis 命令提供类似 STL 的 C++ 接口,符合 C++ 编程习惯 - **智能集群管理**:客户端自动缓存和适应 Redis 集群哈希槽的变化,无需手动干预 - **多种通信模式**:支持单机、集群和 Pipeline 模式,接口统一 - **连接池支持**:内置连接池,支持单机和集群模式,提升资源利用率 - **高性能**:在集群和 Pipeline 模式下表现出色 - **自动重试**:网络错误时自动重试,提高可靠性 - **协程友好**:可在共享栈协程模式下使用 更多详细信息,请参见 **[使用 Acl Redis 客户端](lib_acl_cpp/samples/redis/README.md)** ## 1.5. MQTT 模块 Acl 完整实现了 MQTT 3.1.1 协议,采用流式解析器设计,可灵活适配各种 IO 模式。 **核心特性** - **完整的 MQTT 3.1.1 协议支持**:实现了所有标准命令 - CONNECT/CONNACK/PUBLISH/PUBACK/PUBREC/PUBREL/PUBCOMP - SUBSCRIBE/SUBACK/UNSUBSCRIBE/UNSUBACK - PINGREQ/PINGRESP/DISCONNECT - **面向对象设计**:每个 MQTT 命令对应一个独立的类,结构清晰 - **流式解析器**:独立于 IO 模式,可与任何网络通信方式结合 - **解析与通信分离**:数据解析与网络通信完全解耦,灵活性高 - **双端支持**:可同时用于客户端和服务器端开发 更多详细信息,请参见 **[使用 Acl MQTT](lib_acl_cpp/samples/mqtt/README.md)** ## 1.6. 服务器框架 服务器框架是 Acl 中最核心的模块,帮助开发者快速构建高性能的后端服务(如 Web 服务)。通过 `app/wizard` 中的代码生成工具,可在几秒钟内生成完整的服务代码框架。 **架构设计** Acl 服务器框架由两部分组成: 1. **服务管理器(acl_master)**:源自著名的 Postfix MTA 的 master 进程,经过大量扩展成为通用的服务管理器 2. **服务模板**:提供多种服务模板供开发者选择 **六种服务模板** - **进程服务模型** 一个连接对应一个进程。 - 优点:编程简单、安全稳定 - 缺点:并发能力有限 - 适用场景:对安全性要求高、并发量不大的场景 - **线程服务模型** 每个进程通过线程池处理所有客户端连接,采用 IO 事件触发机制。 - 优点:用少量线程处理大量连接,编程相对简单 - 特点:连接有数据时才绑定线程,处理完立即释放 - 适用场景:高并发场景,比 AIO 模型更易开发 - **AIO 服务模型(非阻塞)** 类似 Nginx/Squid/IRCd,单线程以非阻塞 IO 方式处理大量连接。 - 优点:处理效率高、资源消耗低 - 缺点:编程复杂度较高 - 适用场景:超高并发、对性能要求极高的场景 - **协程服务模型** 结合了非阻塞模型的高并发能力和同步编程的简单性。 - 优点:高并发 + 低编程复杂度,顺序 IO 编程方式 - 特点:自动将阻塞操作转换为非阻塞过程,提升并发能力 - 适用场景:高并发场景的首选,兼顾性能和开发效率 - **UDP 服务模型** 专门用于 UDP 通信的服务模型。 - 适用场景:需要 UDP 协议的应用 - **触发器服务模型** 用于处理定时任务的后台服务(类似系统的 crontab)。 - 适用场景:定时任务、后台调度 # 2. 其他重要模块 ## 2.1. MIME 模块 MIME(多用途互联网邮件扩展)是一种重要的数据格式标准,广泛应用于电子邮件和 Web 应用程序。 **功能特性** - 完整实现 MIME 相关 RFC 标准:RFC2045/RFC2047/RFC822 - 提供独立于 IO 模型的流式 MIME 数据解析器 - 可灵活用于同步或异步 IO 程序 - 支持 MIME 数据的解析和构建 ## 2.2. 编解码模块 Acl 提供了丰富的编解码器,所有编解码器均采用流式解析设计,独立于 IO 通信层。 **支持的编解码格式** - **JSON**:流式 JSON 解析器和构建器,支持 JSON 与 C 结构体的序列化/反序列化,大幅提升开发效率 - **XML**:流式 XML 解析器和构建器 - **Base64**:Base64 编解码 - **URL**:URL 编解码 - 其他:UUCODE、QPCODE、RFC2047 等 ## 2.3. 数据库模块 Acl 提供了统一的数据库抽象接口,简化数据库应用开发。 **核心特性** - **统一接口**:为 MySQL、PostgreSQL、SQLite 提供统一的操作接口 - **SQL 安全**:内置 SQL 编解码器,自动转义特殊字符,有效防止 SQL 注入攻击 - **动态加载**:采用动态库加载方式,不使用数据库功能时无需关心依赖 - **连接池支持**:内置数据库连接池管理 ## 2.4. 连接池管理器 Acl 提供了通用的连接池管理器,被广泛应用于Acl库各个客户端通信模块。 **应用场景** - Redis 客户端连接池 - 数据库连接池 - HTTP 客户端连接池 - 其他网络客户端连接池 ## 2.5. 其他客户端库 除 Redis 客户端外,Acl 还实现了多种常用的客户端通信库。 **支持的客户端** - **Memcached**:支持连接池 - **Handler Socket**:MySQL 的 Handler Socket 插件客户端 - **Beanstalk**:消息队列客户端 - **Disque**:分布式消息队列客户端 ## 2.6. DNS 模块 Acl 提供了完整的 DNS 解决方案,既可以使用系统 API,也可以直接实现 DNS 协议。 **功能特性** - **系统 API 封装**:封装 `getaddrinfo` 和 `gethostbyname` 等系统 API - **协议实现**:完整实现 RFC1035 规定的 DNS 协议 - **双端支持**:可用于实现 DNS 客户端或 DNS 服务器 - **结果缓存**:支持 DNS 查询结果缓存,提升性能 # 3. 平台支持和编译 ## 3.1. 在不同平台上编译 Acl Acl 是一个跨平台库,支持主流操作系统和多种编译工具链。 **支持的平台** - Linux、Windows、macOS、FreeBSD、Solaris - Android、iOS、鸿蒙(Harmony) **编译方式** **Linux/UNIX 平台** - **编译器**:gcc/clang - **Make 方式**: ```bash cd acl/ make ``` 编译完成后会在 `acl/` 目录生成: - `libacl_all.a`(静态库,包含 lib_acl.a、lib_protocol.a 和 libacl_cpp.a) - `libacl_all.so`(动态库) - **CMake 方式**: ```bash ./cmake-build.sh ``` - **XMake 方式**: ```bash xmake ``` **Windows 平台** - 支持 Visual Studio 2003/2008/2010/2012/2013/2015/2019 等版本 - 如需使用 VS6/VS2005,可参考 VS2003 的编译配置 **macOS/iOS 平台** - 使用 Xcode 进行编译 **Android 平台** - 使用 **Android Studio** 打开 **`acl/android/acl_ndk20b/`** 项目 **鸿蒙(Harmony)平台** - 使用 **DevEco Studio** 打开 **`acl/harmony/api13/`** 项目 **跨平台编译** - 支持使用 **CMake** 进行跨平台编译 ## 3.2. Windows 平台编译注意事项 在 Windows 环境下使用 Acl 动态库时,需要在项目中添加相应的预定义宏。 **预定义宏说明** | 使用的库 | 需要预定义的宏 | 说明 | |---------|--------------|------| | lib_acl 动态库 | `ACL_DLL` | 基础库 | | lib_protocol HTTP 库 | `HTTP_DLL` | HTTP 协议库 | | lib_protocol ICMP 库 | `ICMP_DLL` | ICMP 协议库 | | lib_acl_cpp 动态库 | `ACL_CPP_DLL` | C++ 库 | **详细说明** - 详细的编译过程和配置方法,请参见:[Acl 库的编译和使用](BUILD.md) # 4. 快速开始 ## 4.1. 第一个 Acl 示例 这是一个最简单的 Acl 程序,展示如何使用 Acl 的字符串类。 ```c++ #include #include "acl_cpp/lib_acl.hpp" int main() { acl::string buf = "hello world!\r\n"; std::cout << buf.c_str() << std::endl; return 0; } ``` ## 4.2. 简单的 TCP 服务器 这个示例展示如何使用 Acl 创建一个简单的 TCP 回显服务器,使用多线程处理客户端连接。 ```c++ #include #include "acl_cpp/lib_acl.hpp" void run() { const char* addr = "127.0.0.1:8088"; acl::server_socket server; if (!server.open(addr)) { // 绑定并监听本地地址。 return; } while (true) { acl::socket_stream* conn = server.accept(); // 等待连接。 if (conn == NULL) { break; } std::thread thread([=] { // 启动一个线程来处理连接。 char buf[256]; int ret = conn->read(buf, sizeof(buf), false); // 读取数据。 if (ret > 0) { conn->write(buf, ret); // 写入接收到的数据。 } delete conn; }); thread.detach(); } } ``` ## 4.3. 简单的 TCP 客户端 这个示例展示如何使用 Acl 创建一个 TCP 客户端,连接服务器并进行数据收发。 ```c++ #include "acl_cpp/lib_acl.hpp" void run() { const char* addr = "127.0.0.1:8088"; int conn_timeout = 5, rw_timeout = 10; acl::socket_stream conn; if (!conn.open(addr, conn_timeout, rw_timeout)) { // 连接服务器。 return; } const char data[] = "Hello world!\r\n"; if (conn.write(data, sizeof(data) - 1) == -1) { // 向服务器发送数据。 return; } char buf[256]; int ret = conn.read(buf, sizeof(buf) - 1, false); if (ret > 0) { // 从服务器读取。 buf[ret] = 0; std::cout << buf << std::endl; } } ``` ## 4.4. 协程 TCP 服务器 这个示例展示如何使用 Acl 协程创建高并发的 TCP 服务器,用顺序编程方式实现异步处理。 ```c++ #include "acl_cpp/lib_acl.hpp" #include "fiber/go_fiber.hpp" void run() { const char* addr = "127.0.0.1:8088"; acl::server_socket server; if (!server.open(addr)) { return; } go[&] { // 创建一个服务器协程来等待连接。 while (true) { acl::shared_stream conn = server.shared_accept(); if (conn == nullptr) { break; } go[conn] { // 创建一个客户端协程来处理连接。 while (true) { char buf[256]; int ret = conn->read(buf, sizeof(buf), false); if (ret <= 0 || conn->write(buf, ret) != ret) { break; } } }; } }; acl::fiber::schedule(); // 启动协程调度过程。 } ``` ## 4.5. HTTP 客户端示例 这个示例展示如何使用 Acl 创建 HTTP 客户端,发送 HTTP 请求并获取响应。 ```c++ #include "acl_cpp/lib_acl.hpp" bool run() { acl::http_request conn("www.baidu.com:80"); acl::http_header& header = conn.request_header() header.set_url("/") .set_keep_alive(false); .set_content_type("text/html"); if (!conn.request(NULL, 0)) { return false; } int status = conn.http_status(); if (status != 200) { return false; } long long len = conn.body_length(); if (len <= 0) { return true; } acl::string buf; if (!conn.get_body(body)) { return false; } return true; } ``` ## 4.6. 协程 HTTP 服务器 这个示例展示如何使用 Acl 协程创建一个功能完整的 HTTP 服务器,支持路由、配置管理等特性。 ```c++ #include "acl_cpp/lib_acl.hpp" // 必须在 http_server.hpp 之前 #include "fiber/http_server.hpp" static char *var_cfg_debug_msg; static acl::master_str_tbl var_conf_str_tab[] = { { "debug_msg", "test_msg", &var_cfg_debug_msg }, { 0, 0, 0 } }; static int var_cfg_io_timeout; static acl::master_int_tbl var_conf_int_tab[] = { { "io_timeout", 120, &var_cfg_io_timeout, 0, 0 }, { 0, 0 , 0 , 0, 0 } }; int main(int argc, char* argv[]) { const char* addr = "0.0.0.0|8194"; const char* conf = argc >= 2 ? argv[1] : NULL; acl::http_server server; // 调用 acl::master_base 类中的方法。 server.set_cfg_int(var_conf_int_tab).set_cfg_str(var_conf_str_tab); // 调用 acl::http_server 中的方法。 server.on_proc_init([&addr] { printf("---> after process init: addr=%s, io_timeout=%d\r\n", addr, var_cfg_io_timeout); }).on_proc_exit([] { printf("---> before process exit\r\n"); }).on_proc_sighup([] (acl::string& s) { s = "+ok"; printf("---> process got sighup\r\n"); return true; }).on_thread_accept([] (acl::socket_stream& conn) { printf("---> accept %d\r\n", conn.sock_handle()); return true; }).Get("/", [](acl::HttpRequest&, acl::HttpResponse& res) { std::string buf("hello world1!\r\n"); res.setContentLength(buf.size()); return res.write(buf.c_str(), buf.size()); }).Post("/json", [](acl::HttpRequest& req, acl::HttpResponse& res) { acl::json* json = req.getJson(); if (json) { return res.write(*json); } else { std::string buf = "no json got\r\n"; res.setContentLength(buf.size()); return res.write(buf.c_str(), buf.size()); } }).run_alone(addr, conf); return 0; } ``` ## 4.7. Redis 客户端示例 这个示例展示如何使用 Acl Redis 客户端进行多线程操作,包括连接池管理和基本的 Redis 命令。 ```c++ #include #include "acl_cpp/lib_acl.hpp" static void thread_run(acl::redis_client_cluster& conns) { acl::redis cmd(&conns); std::map attrs; attrs["name1"] = "value1"; attrs["name2"] = "value2"; attrs["name3"] = "value3"; acl::string key = "hash-key-1"; if (!cmd.hmset(key, attrs)) { printf("hmset error=%s\r\n", cmd.result_error()); return; } attrs.clear(); if (!cmd.hgetall(key, attrs)) { printf("hgetall error=%s\r\n", cmd.result_error()); } } void run() { const char* addr = "126.0.0.1:6379"; acl::redis_client_cluster conns; conns.set(addr, 0); const size_t nthreads = 10; std::thread threads[nthreads]; // 创建一些线程来使用相同的 conns 测试 redis。 for (size_t i = 0; i < nthreads; i++) { threads[i] = std::thread(thread_run, std::ref(conns)); } // 等待所有线程退出 for (size_t i = 0; i < nthreads; i++) { threads[i].join(); } } ``` # 5. 更多信息 ## 5.1. 示例代码 Acl 库提供了大量的示例代码供学习参考,涵盖各个功能模块的使用方法。 **示例索引**:[SAMPLES.md](SAMPLES.md) ## 5.2. 更多简单示例 为了帮助开发者快速上手,我们提供了大量简单易懂的小示例。 **示例仓库**:[Acl Demos](https://github.com/acl-dev/demo/) ## 5.3. 常见问题(FAQ) 在使用 Acl 过程中遇到问题?请查看常见问题解答。 **FAQ 文档**:[FAQ.md](FAQ.md) ## 5.4. 开源许可证 Acl 采用 LGPL-v2.1 开源许可证,可自由用于商业和非商业项目。 **许可证详情**:[LICENSE.txt](LICENSE.txt) ## 5.5. 相关链接 **官方资源** - 🌐 官方网站:https://acl-dev.cn/ - 💻 GitHub:https://github.com/acl-dev/acl - 🇨🇳 Gitee:https://gitee.com/acl-dev/acl - 📝 技术博客:https://blog.csdn.net/zsxxsz - 🐦 微博:http://weibo.com/zsxxsz **社区交流** - 💬 QQ 群:705290654 ## 5.6. 致谢 感谢 为 Acl 项目提供的支持。 # 6. 附录 ## 6.1. 软件分层架构 ``` ┌─────────────────────────────────────────────────────────┐ │ 应用层 (Application) │ │ 业务代码、HTTP服务器、WebSocket服务、Redis客户端等 │ └─────────────────────────────────────────────────────────┘ ↓ ┌────────────────────────────────────────────────────────┐ │ 高级抽象层 (High-level API) │ │ ┌──────────┬──────────┬──────────┬──────────┐ │ │ │ HTTP │ Redis │ MQTT │ DB │ │ │ │ 模块 │ 模块 │ 模块 │ 模块 │ │ │ └──────────┴──────────┴──────────┴──────────┘ │ │ ┌──────────┬──────────┬──────────┬──────────┐ │ │ │ Master │ Fiber │ ConnPool │ Stream │ │ │ │ 框架 │ 协程库 │ 连接池 │ 流处理 │ │ │ └──────────┴──────────┴──────────┴──────────┘ │ └────────────────────────────────────────────────────────┘ ↓ ┌─────────────────────────────────────────────────────────┐ │ 核心库层 (Core Library) │ │ - 网络 I/O (socket, stream, aio) │ │ - 事件驱动 (event, epoll, kqueue, iocp) │ │ - 内存管理 (memory pool, dbuf) │ │ - 数据结构 (string, array, hash, list) │ │ - 工具类 (log, config, thread, process) │ └─────────────────────────────────────────────────────────┘ ↓ ┌───────────────────────────────────────────────────────---─---─┐ │ 操作系统层 (OS Layer) │ │ Linux / FreeBSD / macOS / Windows / Android / iOS / Harmony │ └────────────────────────────────────────────────────────------─┘ ``` ## 6.2. 项目目录结构 ``` acl/ ├── lib_acl/ # 核心 C 库(基础库) │ ├── include/ # 公共头文件 │ ├── src/ # 源代码实现 │ │ ├── stdlib/ # 标准库(字符串、内存、文件等) │ │ │ ├── common/ # 通用数据结构(哈希表、链表、队列、树等) │ │ │ ├── memory/ # 内存管理(内存池、slab、dbuf) │ │ │ ├── string/ # 字符串操作 │ │ │ ├── filedir/ # 文件和目录操作 │ │ │ ├── configure/ # 配置文件解析 │ │ │ ├── iostuff/ # IO 工具函数 │ │ │ ├── debug/ # 调试工具 │ │ │ └── sys/ # 系统相关封装 │ │ ├── net/ # 网络模块 │ │ │ ├── connect/ # 客户端连接 │ │ │ ├── listen/ # 服务端监听 │ │ │ └── dns/ # DNS 解析 │ │ ├── event/ # 事件引擎(epoll/kqueue/iocp/select/poll) │ │ ├── aio/ # 异步 IO 模块 │ │ ├── thread/ # 线程和线程池 │ │ ├── master/ # 服务器框架(进程管理) │ │ │ └── template/ # 服务模板(进程/线程/aio/协程/UDP/触发器) │ │ ├── db/ # 数据库模块 │ │ │ ├── mysql/ # MySQL 支持 │ │ │ ├── memdb/ # 内存数据库 │ │ │ └── zdb/ # ZDB 存储引擎 │ │ ├── json/ # JSON 解析器 │ │ ├── xml/ # XML 解析器 │ │ ├── code/ # 编解码(base64/url/html 等) │ │ ├── msg/ # 消息队列 │ │ ├── init/ # 初始化模块 │ │ ├── ioctl/ # IO 控制 │ │ ├── proctl/ # 进程控制(Windows) │ │ └── unit_test/ # 单元测试框架 │ └── samples/ # 大量示例代码 │ ├── lib_protocol/ # 协议库(C 实现) │ ├── include/ # 协议头文件 │ ├── src/ # 协议实现 │ │ ├── http/ # HTTP 协议 │ │ ├── icmp/ # ICMP/Ping 协议 │ │ └── smtp/ # SMTP 邮件协议 │ └── samples/ # 协议示例 │ ├── lib_acl_cpp/ # C++ 封装库(高级功能) │ ├── include/ # C++ 头文件 │ │ ├── acl_cpp/ # 主要头文件目录 │ │ │ ├── stdlib/ # 标准库封装 │ │ │ ├── stream/ # 流处理 │ │ │ ├── http/ # HTTP 客户端和服务端 │ │ │ ├── redis/ # Redis 客户端 │ │ │ ├── mqtt/ # MQTT 协议 │ │ │ ├── db/ # 数据库封装 │ │ │ ├── mime/ # MIME 协议 │ │ │ ├── master/ # Master 框架封装 │ │ │ ├── connpool/ # 连接池 │ │ │ ├── session/ # Session 管理 │ │ │ ├── memcache/ # Memcached 客户端 │ │ │ ├── beanstalk/ # Beanstalk 客户端 │ │ │ ├── disque/ # Disque 客户端 │ │ │ ├── hsocket/ # Handler Socket 客户端 │ │ │ ├── ipc/ # 进程间通信 │ │ │ ├── queue/ # 文件队列 │ │ │ ├── serialize/ # 序列化(JSON/Gson) │ │ │ ├── aliyun/ # 阿里云 SDK(OSS) │ │ │ └── event/ # 事件封装 │ ├── src/ # C++ 源码实现 │ │ ├── stdlib/ # 标准库实现(string/logger/charset/zlib 等) │ │ ├── stream/ # 流实现(socket/ssl/aio) │ │ ├── http/ # HTTP 实现 │ │ │ ├── h2/ # HTTP/2 支持(待实现) │ │ │ └── h3/ # HTTP/3 支持(待实现) │ │ ├── redis/ # Redis 客户端实现 │ │ ├── mqtt/ # MQTT 协议实现 │ │ ├── db/ # 数据库实现 │ │ ├── mime/ # MIME 实现 │ │ ├── master/ # Master 框架实现 │ │ ├── connpool/ # 连接池实现 │ │ ├── session/ # Session 实现 │ │ ├── memcache/ # Memcached 实现 │ │ ├── beanstalk/ # Beanstalk 实现 │ │ ├── disque/ # Disque 实现 │ │ ├── hsocket/ # Handler Socket 实现 │ │ ├── ipc/ # IPC 实现 │ │ ├── queue/ # 队列实现 │ │ ├── serialize/ # 序列化实现 │ │ ├── smtp/ # SMTP 实现 │ │ ├── aliyun/ # 阿里云客户端(待实现) │ │ └── net/ # 网络工具(DNS) │ └── samples/ # 丰富的示例代码 │ ├── http/ # HTTP 示例 │ ├── redis/ # Redis 示例 │ ├── mqtt/ # MQTT 示例 │ ├── db/ # 数据库示例 │ ├── master/ # Master 框架示例 │ ├── fiber/ # 协程示例 │ └── ... # 更多示例 │ ├── lib_fiber/ # 协程库(核心特性) │ ├── c/ # C 语言实现 │ │ ├── include/ # 协程头文件 │ │ └── src/ # 协程源码 │ │ ├── common/ # 通用模块 │ │ ├── fiber/ # 协程核心 │ │ ├── event/ # 事件引擎 │ │ ├── sync/ # 同步原语(mutex/sem/event) │ │ ├── hook/ # 系统 API Hook │ │ └── ... │ ├── cpp/ # C++ 封装 │ │ ├── include/ # C++ 头文件 │ │ └── src/ # C++ 实现 │ ├── samples-c/ # C 语言示例 │ ├── samples-c++/ # C++ 示例 │ ├── samples-c++1x/ # C++11/14/17 示例 │ ├── samples-gui/ # GUI 示例(Windows) │ └── unit_test/ # 单元测试 │ ├── lib_dict/ # 字典库(可选) │ ├── bdb/ # Berkeley DB 支持 │ ├── cdb/ # CDB 支持 │ └── tc/ # Tokyo Cabinet 支持 │ ├── lib_tls/ # TLS/SSL 库(可选) │ └── src/ # TLS 实现 │ ├── lib_rpc/ # RPC 库(实验性) │ └── src/ # RPC 实现 │ ├── app/ # 应用程序和工具 │ ├── wizard/ # 代码生成向导(重要工具) │ │ └── tmpl/ # 服务模板(进程/线程/aio/协程/UDP/触发器) │ ├── wizard_demo/ # 向导生成的示例项目 │ ├── master/ # Master 服务管理器 │ │ ├── daemon/ # 守护进程 │ │ ├── tools/ # 管理工具 │ │ └── ... │ ├── jaws/ # Web 应用服务器 │ ├── redis_tools/ # Redis 工具集 │ ├── net_tools/ # 网络工具 │ ├── gson/ # JSON 序列化工具 │ ├── jencode/ # 编码转换工具 │ ├── iconv/ # 字符集转换 │ └── ... │ ├── doc/ # 文档目录 │ ├── README.md # 文档索引 │ ├── fiber/ # 协程文档 │ ├── http/ # HTTP 文档 │ ├── redis/ # Redis 文档 │ ├── mqtt/ # MQTT 文档 │ ├── db/ # 数据库文档 │ ├── master/ # Master 框架文档 │ ├── stream/ # Stream 文档 │ ├── mime/ # MIME 文档 │ ├── connpool/ # 连接池文档 │ ├── rfc/ # RFC 文档 │ └── ... │ ├── include/ # 第三方库头文件 │ ├── mysql/ # MySQL 头文件 │ ├── pgsql/ # PostgreSQL 头文件 │ ├── sqlite/ # SQLite 头文件 │ ├── openssl-1.1.1q/ # OpenSSL 头文件 │ ├── mbedtls/ # MbedTLS 头文件 │ ├── polarssl/ # PolarSSL 头文件 │ ├── zlib-1.2.11/ # Zlib 头文件 │ └── ... │ ├── lib/ # 预编译库文件(按平台分类) │ ├── linux64/ # Linux 64 位 │ ├── linux32/ # Linux 32 位 │ ├── win32/ # Windows 32 位 │ ├── win64/ # Windows 64 位 │ ├── macos/ # macOS │ ├── freebsd/ # FreeBSD │ └── solaris/ # Solaris │ ├── android/ # Android 平台支持 │ ├── acl_ndk20b/ # NDK r20b 项目 │ ├── acl_ndk28c/ # NDK r28c 项目 │ └── samples/ # Android 示例 │ ├── harmony/ # 鸿蒙平台支持 │ ├── api9/ # HarmonyOS API 9 │ ├── api12/ # HarmonyOS API 12 │ ├── api13/ # HarmonyOS API 13 │ └── api16/ # HarmonyOS API 16 │ ├── xcode/ # Xcode 项目(macOS/iOS) │ └── ... # Xcode 工程文件 │ ├── dist/ # 安装目录(make install 后) │ ├── include/ # 安装的头文件 │ ├── lib/ # 安装的库文件 │ └── master/ # Master 配置和脚本 │ ├── unit_test/ # 单元测试 │ └── ... # 测试用例 │ ├── packaging/ # 打包配置 │ └── ... # RPM 打包脚本 │ ├── CMakeLists.txt # CMake 构建配置 ├── Makefile # 主 Makefile ├── xmake.lua # XMake 构建配置 ├── README.md # 英文说明文档 ├── README_CN.md # 中文说明文档 ├── SAMPLES.md # 示例代码索引 ├── FAQ.md # 常见问题 ├── BUILD.md # 编译说明 ├── LICENSE.txt # 开源许可证 └── changes.txt # 更新日志 ```