acl -- One advanced C/C++ library for Unix/Windows.
- 一�?描述
- 二�?平台支�?及编译
- 三�?目录结构说�?�
- 四�?�?在使用acl
- 五�?使用许可
- 六�?参�?
一�?描述
acl 工程�?�一个跨平台�?支�?LINUX,WIN32,Solaris,MacOS,FreeBSD)的网络通信库及服务器编程框架,�?�时�?供更多的实用功�?�库。通过该库,用�?�可以非常容�?�地编写支�?多种模式(多线程�?多进程�?非�?�塞�?触发器�?UDP方式�?协程方式)的服务器程序,WEB 应用程序,数据库应用程序。此外,该库�?�?供了常�?应用的客�?�端通信库�?如:HTTP�?SMTP�?ICMP�?redis�?memcache�?beanstalk�?handler socket),常�?�?式编解�?库:XML/JSON/MIME/BASE64/UUCODE/QPCODE/RFC2047 etc。
1.1�?库组�??
本工程主�?包�?� 5 个库及大量示例。5 个库的说�?�如下:
- lib_acl: 该库�?�最基础的库,其�? 4 个库均依赖于该库; 该库以 C 语言实现。
- lib_protocol: 该库主�?实现了 http 协议及 icmp/ping 协议; 该库以 C 语言实现。
- lib_acl_cpp: 该库用 C++ 语言�?装了 lib_acl/lib_protocol 两个库,�?�时增加了一些其�?有价值的功�?�应用。
- lib_fiber: 该库为支�?协程库,直接 hook 系统 read/write 等 API,与 epoll 配�??支�?�?并发网络编程。
- lib_dict: 该库主�?实现了 KEY-VALUE 的字典式�?储库,该库另外�?依赖于 BDB, CDB 以及 tokyocabinet 库。
- lib_tls: 该库�?装了 openssl 库,使 lib_acl 的通信模式可以支�? ssl。
1.2�?功�?�模块组�??
1.2.1�?网络通信库
1.2.1.1�?�?处�?�模块
该模块�?�整个 acl 网络通信最基础的�?式通信模块,不仅支�?网络�?,�?�时�?支�?文件�?,主�?支�?:
- 按行读数据,兼容 win32 下的 \r\n,�?�时兼容 UNIX 下的 \n 的结束符
- 按行读数据但�?求自动去掉尾�?�的 \n �?� \r\n
- 以字符串为�?�隔符读取数据
- 读规定长度的数据
- 尝试性读一行数据�?�尝试性读规定长度数据
- 探测网络 IO 状�?
- 写入一行数据
- 按格式符写入数据,类似于 fprintf
- 文件�?定位操作,类似于 fseek
- 一次性写入一组数据,类似于 unix 下的 writev
- 将文件�?�短,类似于 ftrunk
- 获取文件大小
- 获得当前文件�?指�?位置,类似于 ftell
- 获得文件尺寸
- 获得网络�?的本地地址及远程地址
1.2.1.2�?网络操作模块
该模块主�?支�?网络服务端监�?��?支�? TCP/UDP/UNIX 域套接口)�?网络客�?�端连接�?支�? TCP/UNIX 域套接口)�?DNS 域�?�查询及结果缓�?�?支�?�?用系统 gethostbyname/getaddrinfo 函数和直接发�? DNS 协议两种方式)�?套接口�?socket)操作及取本机网卡等功�?�。
1.2.1.3�?非�?�塞网络�?
支�?非�?�塞方式连接�?读�?按行读,规定长度读)�?写�?写行,写规定长度,写一组数据)等操作。
1.2.1.4�?常�?网络应用协议库
主�?支�?常�?网络应用协议,诸如:HTTP�?SMTP�?ICMP,其中 HTTP�?ICMP 两个模块实现了�?�塞�?非�?�塞两种通信方式;此外,HTTP 协议在C++�?的 lib_acl_cpp 中�?支�?服务端�?客�?�端两种通信方式,当作为服务端使用时,支�?类似于 JAVA HttpServlet 的接口使用方式,当作为客�?�端方式使用时,支�?连接池与集群管�?�方式,该模块�?�时支�? cookie�?session�?HTTP MIME 文件上传�?�?�块传输�?字符集自动转换�?自动解压缩�?断点续传等丰富的功�?�。
1.2.1.5�?常�?网络通信库
支�? memcached�?beanstalk�?handler socket 客�?�端通信库,该通信库支�?连接池方式。
1.2.2�?网络 IO 事件引擎
支�? select(UNIX/LINUX/WIN32)�?poll(UNIX/LINUX)�?epoll(LINUX)�?kqueue(BSD)�?devpoll(solaris)�?iocp(WIN32)�?窗口�?�?�(WIN32) 等系统事件引擎,�?�时支�? Reactor 及 Proactor 两种编程模型。
1.2.3�?网络服务器框架
该模块�?� acl 中最为重�?的模块,�?供了服务器编程中常用的基础设施,该服务器框架来�?于著�?�的 Postfix,在其基础上进行了诸多扩展,目前已经支�?的主�?服务模型有:
1.2.3.1�?进程模型
一个连接一个进程,这种模型的�?点�?�编程简单�?安全稳定,缺点�?�并发度不�?;
1.2.3.2�?线程模型
每个�?进程�?�由线程池中的一组线程处�?�所有的客�?�端连接,采用 IO 事件触发方式,只有当连接有数据可读时才会将连接与一个线程进行绑定,线程处�?�完�?�立即归�?给线程池,这种模型的最大�?点�?�可以用少量的线程便可以处�?�大量的客�?�端连接,而且编程比�?简单�?相对于非�?�塞模型);
1.2.3.3�?非�?�塞模型
每个�?进程�?�由一个单独的非�?�塞线程组�??,该线程采用完全非�?�塞 IO 方式处�?�外来的大量客�?�端连接�?类似于 nginx/squid/ircd),该模型的�?点�?�处�?��?率�?占用资�?少,可以处�?�大量客�?�端连接,缺点�?�编程比�?复杂;
1.2.3.4�?协程模型
虽然非�?�塞服务模型可以获得大并发处�?��?�力,但编程复杂度�?�?,协程模型综�??了大并发的处�?��?�力和�?低的编程复杂度的特点,使编程人�?可以顺序 IO 的编程方式简单实现业务逻辑;
1.2.3.5�?UDP通信模型
该模型主�?为了支�? UDP 网络过程而增加的服务模型;
1.2.3.6�?触发器模型
该模型的实例主�?用来处�?�一些定时任务的�?�台服务过程�?类似于系统的 crontab)。
服务器框架中的�?进程实用采用半驻留服务模型,支�?�?进程预�?�动机�?��?最大最小进程数控�?��?�?进程异常报警�?单一进程监�?�多个地址�?可�?�时监�?�TCP/UDP套接字以及 UNIX 域套接字)�?�?进程安全控�?��?日志输出至 syslog-ng�?多进程TCP连接均匀化;采用配置文件驱动方式,每个服务一个配置文件,方便进程管�?�及服务进程在线升级。
1.2.4�?线程及线程池模块
�?供了跨平台的支�? Posix 规�?的线程接口�?支�?WIN32);线程池模块通过多种措施最大程度地减少线程任务�?�配时的�?冲�?�?用在 acl 服务器框架中多进程多线程服务模型中)。
1.2.5�?HTTP 协议库
�?供了完整的 HTTP 协议实现,支�? HTTP/1.0�?1.1 �?本; �?�时支�?客�?�端模式及服务端模式:
1.2.5.1�?客�?�端模式
- 支�?连接池方式;
- 支�? chunked 块传输;
- 支�?压缩传输;
- 支�? SSL 加密传输;
- 支�?断点续传;
- 支�?设置/获取 Cookies;
- 支�? Websocket.
1.2.5.2�?服务端模式
- 支�?类似于 Java 的 HttpServlet 使用方式;
- 支�? chunked 块传输;
- 支�?压缩传输;
- 支�? SSL 加密传输;
- 支�?断点续传;
- 支�?设置/获取 Cookies;
- 支�? HTTP MIME 格式;
- 支�? Websocket.
1.2.6�?Redis 客�?�端库
- 支�? redis 集群模式及非集群模式;
- 支�?连接池方式;
- 按 redis 数据结构类型�?��??独立的 C++ 类;
- 每个命令�?�射为 1 个至多个函数. 具体内容参�?:使用 acl 库编写�?�?的 C++ redis 客�?�端应用
1.2.7�?MIME 协议库
- 支�?�?式 MIME 数据解�?;
- 支�? MIME RFC2045,RFC2047,RFC822.
1.2.8�?网络协程库
直接 hook 系统底层 IO API,与 epoll 配�??实现网络 IO 的�?并发�?�?性�?�编程框架,通过该模块可以使一些原生的常�?�?�塞式网络库�?如 mysql/redis/http 等客�?�端库)直接支�?�?并发网络操作;通过使用该模块,编程者采用顺序思维编程方式,在协程库内�?�将�?�塞模式转为非�?�塞模式,因而大大�?�?了网络并发�?�力及处�?�性�?�。
1.2.9�?数据库相关
设计了统一的数据库操作接口及连接池处�?�方式,目前支�? sqlite/mysql/postgresql。
1.2.10�?数字键的 K-V �?�?�?储模块�?zdb)
采取 KEY/VALUE �?�块�?储方式,因为 KEY �?定为数字类型,只需内�?计算便可算出 KEY 的位置,KEY 中�?放了 VALUE 的位置,所以对于任何的数据查询只需两次�?�?定位。�?本人在和讯�?��?量统计�?储时,使用该种方式替代了BSD�?TC 等采用B树的 K-V �?储)。
1.2.11�?其�?功�?�库
1.2.11.1�?常用数据结构模块
该模块�?供了常�?的�?希表�?及多种�?希算法)�?动�?数组�?双�?�链表�?平衡二叉树�?�?��?��?二�?�块查找树�?256 叉匹配树等数组结构;�?供了统一的数据结构�?�历方法(采用 acl_foreach)。
1.2.11.2�? 内�?操作模块
该模块�?供三种内�?池模型:
- 基本的内�?方式:内�?��?装了系统的 malloc/free API,�?供了内�?校验等安全措施;该方式�?�时�?供外�?�注册接口,�?许使用者注册自己的内�?�?�配模型;
- 内�?片(slab) 方式:根据不�?�的尺寸大小�?�配多个定长内�?链,可以有�?地减少内�?碎片,大大�?升内�?�?�配�?率;
- 内�?链方式:将长度不一的小内�?�?�配在一条内�?页上,可以非常有�?地使用内�?,减少内�?浪费。
1.2.11.3�?常用字符串操作模块
支�?字符串匹配查找�?前(�?�)�?�比�?�?字符串�?�割�?字符串大小写转换�?H2B/B2H 转换�?URL 编�?/解�?等功�?�。
1.2.11.4�?文件目录模块
支�?多级目录�?�建�?多级目录扫描�?文件句柄缓�?等功�?�,�?�时在处�?�多级目录采用循环方式,�?�免了递归方式时可�?�的�?溢出的�?患。
1.2.11.5�?读配置文件模块
支�?读 name=value 形式的配置文件,value �?长时可以使用反斜杠()�?行,采用配置表方式�?取配置文件中的配置项。
1.2.11.6�?文件�?��?�处�?�库
支�?多组目录�?��?�文件的�?�建�?扫描�?�?�除等操作;常用于临时文件�?��?��?度的服务程序中。
1.2.11.7�?json 解�?库
支�?�?式方式解�? json 数据,�?�时支�? json 数据包组装。
1.2.11.8�?xml 解�?库
支�?�?式方式解�? xml 数据,�?�时支�? xml 数据包组装。
1.2.11.9�?常�?编�?库
�?包括 rfc2047�?url�?base64�?uucode�?qpcode�?charset 等编解�?库,这些解�?库均采用�?式解�?方式,适�??于多种网络 IO 模型�?�?�塞/非�?�塞TCP�?UDP)。
二�?平台支�?及编译
整个工程目前支�? Linux(AS4,5,6, CS4,5,6, ubuntu), Windows, MacOS, FreeBSD, Solaris,Android,IOS。
- Linux/UNIX: 编译器为 gcc,直接在�?端命令行方式下�?��?�进入 lib_acl/lib_protocol/lib_acl_cpp 目录下,�?行 make 命令即可。
- Windows: 可以用 VC2003/VC2008/VC2010/VC2012/vc2013/vc2015 进行编译。(如果需�?用 VC6/VC2005 编译,可以参�? VC2003 的编译条件)。
- MacOS:可使用 xcode 进行编译。
- �?�时支�? CMake 跨平台编译方式
当在 WIN32 环�?下使用动�?库时有几点需�?注意:
- 使用 lib_acl 的动�?库时,需�?在用�?�的工程预定义: ACL_DLL;
- 使用 lib_protocol 动�?库中的 HTTP 库�?� ICMP 库时,需�?在工程中预定义 HTTP_DLL �?� ICMP_DLL;
- 使用 lib_acl_cpp 的动�?库时,需�?在工程中预定义 ACL_CPP_DLL,如果您使用用 VC2003 编译环�?�?��?需�?预定义 VC2003;
- 使用 lib_dict 的动�?库时,需�?在工程中预定义 DICT_DLL;
- 使用 lib_tls 的动�?库时,需�?在工程中预定义 TLS_DLL。
- 详细编译过程,参�?:acl 库的编译及使用
三�?目录结构说�?�
3.1�?lib_acl
- init : 主�?用于�?�始化 acl 基础库
- stdlib : �?�一些比�?基础的功�?�函数库,在 stdlib/ 根目录下主�?包括一些有关日志记录�?网络/文件�?处�?��?VSTRING缓冲操作等功�?�函数;在 stdlib/ 下�?有二级目录,如下:
- 2.1 common : 该目录主�?为一些常用的数据结构及算法的功�?�函数库,象�?希表�?链表�?�?��?��?动�?数组�?堆�?�?缓�?�?平衡二叉树�?模式匹配树等;
- 2.2 memory : 该目录主�?包�?�与内�?操作相关的函数库,象内�?基础�?�配与校验�?内�?池管�?��?内�?�?�片管�?�等;
- 2.3 filedir : 该目录主�?包�?�与目录�?�历�?目录�?�建等相关的库;
- 2.4 configure : 该目录主�?包�?�配置文件的�?��?库;
- 2.5 iostuff : 该目录主�?包�?�一些常用的IO操作的函数库,象读/写超时�?设置IO句柄的�?�塞模式等;
- 2.6 string : 该目录主�?包�?�一些常用的字符串操作的库,�?供了比标准C更�?�活�?�?的字符串操作功�?�;
- 2.7 debug : 主�?用于协助�?试内�?的泄露等功�?�;
- 2.8 sys : 主�?�?�与不�?�操作系统平台相关的API的�?装函数库;
- net: �?�与网络操作相关的函数库,包�?�网络监�?��?网络连接�?DNS查询�?套接口参数设置等功�?�;
- 3.1 connect : 主�?�?�与网络连接相关的函数库,包�?�网络连接�?域套接口连接等;
- 3.2 listen : 主�?�?�与网络监�?�相关的函数库,包�?�网络监�?��?域套接口监�?�等;
- 3.3 dns : 主�?�?�与DNS域�?�查询相关的函数库,包�?�对 gethostbyname 等接口的�?装�?按RFC1035标准直接发�?UDP包方式进行查询等功�?�;
- event : 主�?�?装了 select/poll/epoll/iocp/win message/kqueue/devpoll 等系统API接口,使处�?�网络事件更加�?�活�?�?�?�?简单,另外�?包�?�定时器接口,acl 中的�?多网络应用�?�会用�?�这些接口,象 aio�?master 等模块;
- aio : 主�?包�?�网络异步操作的功�?�函数,该套函数库在处�?��?并发时有非常�?的�?率,而且�?供了比基础API更为�?级的�?用方式,比使用象 libevent 之类的函数库更为简单,而且�?�线程安全的;
- msg : 主�?包�?�了基于线程的�?�?�事件及基于网络的�?�?�事件功�?�;
- thread : 主�?�?��?装了�?�个OS平台下的基础线程API,使对外接口保�?一致性,�?除了平台的差异性,�?�时�?�?供了半驻留线程池的函数库,以及对于线程局�?��?量的扩展;
- db : 主�?�?�一些与数据库有关的功�?�库,定义了一个通用的数据库连接池的框架�?并且实现了mysql的连接池实例);一个简单的内�?数据库�?由�?希表�?链表�?平衡二叉树组�??而�??);ZDB数据�?储引擎,这�?�一个�?�?的基于数字键的�?储引擎;
- proctl : win32 平台下�?��?进程控�?�功�?�库;
- code : 常�?编�?函数库,包括 base64编解�?�?URL编解�?以及一些汉字字符集编�?等;
- unit_test : 包�?�有关进行 C 语言单�?测试的功�?�库;
- xml: �?�一个�?式的 xml 解�?器及构造器,可以支�?�?�塞及�?�塞式网络通信;
- json: �?�一个�?式的 json 解�?器及构造器,可以支�?�?�塞及�?�塞式网络通信;
- master: �?�在 UNIX 环�?下支�?多种服务器模式的服务器框架,目前主�?支�?多进程模式�?多进程多线程模式�?多进程非�?�塞模式�?多进程触发器模式及 UDP 通信模式;
3.2�?lib_protocol
- http: HTTP 协议相关的库,支�? HTTP/1.1,通讯方式支�?�?�步/异步方式
- icmp: icmp/ping 协议库,支�?�?�步/异步通信方式
- smtp: 邮件客�?�端发信协议库
3.3�?lib_acl_cpp
- stdlib: 主�?包�?�字符串处�?�类(string),xml/json 解�?库,zlib 压缩库(依赖于 zlib 库), 日志记录类, 字符集转�?(在UNIX环�?下需�? iconv 库), memcached 客�?�库, 互斥类(支�?线程�?�?文件�?);
- stream: 支�?网络�?/文件�?,支�?�?�塞/非�?�塞两种通信方式,在非�?�塞模式下支�? select/poll/epoll/iocp/win32 message/kqueue/devpoll;支�? ssl 加密传输(�?�塞及非�?�塞方式,需�? polarssl库);
- ipc: 在非�?�塞通信方式,�?供了�?�塞模块与非�?�塞模块整�??的方式;
- http: 比�?完整的 HTTP 通信库及协议解�?库,支�?客�?�端及服务端模式,支�? ssl/gzip 传输方式; 支�?类似于 Java HttpServlet 方式的大�?��?�接口,方便编写 CGI 及 WEB 服务器程序;
- db: �?装了 MYSQL/SQLITE 库,支�?数据库连接池;
- hsocket: 实现了完整的 handler-socket 客�?�端通信库;
- mime: 支�?完整的与邮件编�?相关的库(邮件的 rfc2045-rfc2047/rfc822/base64/uucode 编�?及解�?库).
- master: �?装了 C 库的服务器框架库
- beanstalk: �?�?��?��?�应用 beanstalkd 的客�?�端通信库,支�?连接池
- connpool: 通用的连接池库
- hscoket: mysql 插件 handle-socket 的客�?�端通信库,支�?连接池
- memcache: memcached 应用的客�?�端库,支�?连接池及连接池集群管�?�
- queue: �?�?文件�?��?�操作库
- ipc: �?�塞/非�?�塞通信整�??库
- session: HTTP 会话库
- redis: 完整实现了 redis 协议的客�?�端通信库(总共 12 个大类,150 多个命令),支�?连接池及连接池集群管�?�
- disque: 支�?集群�?�?��?��?�服务 disque 的客�?�端库,支�?连接池及连接池集群管�?�
3.4�?lib_fiber
- c 目录:该目录下主�?为 C 语言�?本实现的网络协程库,其中包�?��?文件及头文件
- cpp 目录:该目录下�?装了 C 语言�?本的网络协程库
- samples 目录:该目录下有大量的使用协程库编程的例�?
3.5�?图例
- 类索引图:

- 异步 IO 类继承图

- IO �?继承图

- acl 服务框架�?护进程事件处�?��?程

- acl 服务器框架�?进程事件处�?��?程

- 接收上传文件的 CGI 程序:

- 文件下载客�?�端程序:

- 网页下载程序:

3.6�?acl 库中有大量示例可供参�?,请参�?:SAMPLES.md
3.7�?acl 使用 FAQ 参�? FAQ.md
四�?�?在使用acl
五�?使用许可
- LGPL-v3 license (see LICENSE.txt in the acl project)
六�?参�?
- WEB 站点: http://zsxxsz.iteye.com
- Github: https://github.com/acl-dev/acl
- Oschina git: https://git.oschina.net/acl-dev/acl
- Download: https://sourceforge.net/projects/acl
- 微 博:http://weibo.com/zsxxsz
- QQ 群: 242722074

Formed in 2009, the Archive Team (not to be confused with the archive.org Archive-It Team) is a rogue archivist collective dedicated to saving copies of rapidly dying or deleted websites for the sake of history and digital heritage. The group is 100% composed of volunteers and interested parties, and has expanded into a large amount of related projects for saving online and digital history.










