acl project是一个跨平台(支持LINUX,WIN32,Solaris,MacOS,FreeBSD)的网络通讯库及server编程框架,同一时候提供不少其它的有用功能库。经过该库,用户可以很easy地编写支持多种模式(多线程、多进程、非堵塞、触发器、UDP方式)的server程序,WEB 应用程序,数据库应用程序。此外,该库还提供了常见应用的client通讯库(如:HTTP、SMTP、ICMP、memcache、beanstalk),常见流式编解码库:XML/JSON/MIME/BASE64/UUCODE/QPCODE/RFC2047 etc。mysql
本project主要包括 5 个库及大量演示样例。5 个库的说明例如如下:nginx
15 得到网络流的本地地址及远程地址git
网络操做模块:该模块主要支持网络服务端监听(支持 TCP/UDP/UNIX 域套接口)、网络client链接(支持 TCP/UNIX 域套接口)、DNS 域名查询及结果缓存(支持调用系统 gethostbyname 函数和直接发送 DNS 协议两种方式)、套接口(socket)操做及取本机网卡等功能。github
非堵塞网络流:支持非堵塞方式链接、读(按行读,规定长度读)、写(写行,写规定长度,写一组数据)等操做。算法
常见网络应用协议库(lib_protocol/lib_acl_cpp):主要支持常见网络应用协议,诸如:HTTP、SMTP、ICMP,当中 HTTP、ICMP 两个模块实现了堵塞、非堵塞两种通讯方式;此外,HTTP 协议在C++版的 lib_acl_cpp 中还支持服务端、client两种通讯方式,看成为服务端使用时,支持相似于 JAVA HttpServlet 的接口使用方式,看成为client方式使用时,支持链接池与集群管理方式,该模块同一时候支持 cookie、session、HTTP MIME 文件上传、分块传输、字符集本身主动转换、本身主动解压缩、断点续传等丰富的功能。sql
常见网络通讯库:支持 memcached、beanstalk、handler socket client通讯库,该通讯库支持链接池方式。数据库
支持 select(UNIX/LINUX/WIN32)、poll(UNIX/LINUX)、epoll(LINUX)、kqueue(BSD)、devpoll(solaris)、iocp(WIN32)、窗体消息(WIN32) 等系统事件引擎,同一时候支持 Reactor 及 Proactor 两种编程模型。编程
该模块是 acl 中最为重要的模块,提供了server编程中常用的基础设施,该server框架来源于著名的 Postfix,在其基础上进行了诸多扩展,眼下已经支持的主要服务模型有:json
server框架中的子进程有用採用半驻留服务模型,支持子进程预启动机制、最大最小进程数控制、子进程异常报警、单一进程监听多个地址(可同一时候监听TCP/UDP套接字以及 UNIX 域套接字)、子进程安全控制、日志输出至 syslog-ng、多进程TCP链接均匀化;採用配置文件驱动方式,每个服务一个配置文件,方便进程管理及服务进程在线升级。ubuntu
该模块提供了常见的哈希表(及多种哈希算法)、动态数组、双向链表、平衡二叉树、队列、二分块查找树、256 叉匹配树等数组结构;提供了统一的数据结构遍历方法(採用 acl_foreach)。
该模块提供三种内存池模型:
支持字符串匹配查找、前(后)向比較、字符串切割、字符串大写和小写转换、H2B/B2H 转换、URL 编码/解码等功能。
支持多级文件夹建立、多级文件夹扫描、文件句柄缓存等功能,同一时候在处理多级文件夹採用循环方式,避免了递归方式时可能的栈溢出的隐患。
支持读 name=value 形式的配置文件,value 较长时可以使用反斜杠()折行,採用配置表方式提取配置文件里的配置项。
提供了跨平台的支持 Posix 规范的线程接口(支持WIN32);线程池模块经过多种措施最大程度地下降线程任务分配时的锁冲突(用在 acl server框架中多进程多线程服务模型中)。
採取 KEY/VALUE 分块存储方式,因为 KEY 限定为数字类型,仅仅需内存计算即可算出 KEY 的位置,KEY 中存放了 VALUE 的位置,因此对于不论什么的数据查询仅仅需两次磁盘定位。(本人在和讯作流量统计存储时,使用该种方式替代了BSD、TC 等採用B树的 K-V 存储)
该模块包含 xml、json、rfc204七、mime、base6四、uucode、qpcode、charset 等编解码库,这些解码库均採用流式解析方式,适合于多种网络 IO 模型(堵塞/非堵塞TCP、UDP)。
设计了统一的数据库操做接口及链接池处理方式,眼下支持 sqlite/mysql。
支持多组文件夹队列文件的建立、扫描、删除等操做;常用于暂时文件队列调度的服务程序中。
整个project眼下支持 Linux(AS4,5,6, CS4,5,6, ubuntu), Windows, MacOS, FreeBSD, Solaris。
当在 WIN32 环境下使用动态库时有几点需要注意:
github: https://github.com/zhengshuxin/acl
sourceforge:http://sourceforge.net/projects/acl/
相关技术博客:http://zsxxsz.iteye.com/
QQ 群: 242722074
acl project有大量的測试用例(近200个):https://github.com/zhengshuxin/acl/blob/master/SAMPLES.md
此外,还几个有用的工具:
一、server程序生成向导:https://github.com/zhengshuxin/acl/tree/master/app/wizard,使用该工具,可以高速地建立网络server程序(甚至于 HTTP WEB server程序)
二、全局惟一ID产生器:https://github.com/zhengshuxin/acl/tree/master/app/gid
三、网络状态监控工具(WIN32):https://github.com/zhengshuxin/acl/tree/master/app/net_tools
四、TCP 链接分配器:https://github.com/zhengshuxin/acl/tree/master/app/master_dispatch
五、字符集转换器:https://github.com/zhengshuxin/acl/tree/master/app/jencode
二、异步 IO 类继承图
三、IO 流继承图
四、接收上传文件的 CGI 程序:
五、文件下载client程序:
六、网页下载程序: