一、描述
acl 工程是一个跨平台(支持LINUX,WIN32,Solaris,MacOS,FreeBSD)的网络通信库及服务器编程框架,同时提供更多的实用功能 库。通过该库,用户可以非常容易地编写支持多种模式(多线程、多进程、非阻塞、触发器、UDP方式)的服务器程序,WEB 应用程序,数据库应用程序。此外,该库还提供了常见应用的客户端通信库(如:HTTP、SMTP、ICMP、memcache、beanstalk),常 见流式编解码库:XML/JSON/MIME/BASE64/UUCODE/QPCODE/RFC2047 etc。
1.1、库组成
本工程主要包含 5 个库及大量示例。5 个库的说明如下:
- 1) lib_acl: 该库是最基础的库,其它 4 个库均依赖于该库; 该库以 C 语言实现。
- 2) lib_protocol: 该库主要实现了 http 协议及 icmp/ping 协议; 该库以 C 语言实现。
- 3) lib_acl_cpp: 该库用 C++ 语言封装了 lib_acl/lib_protocol 两个库,同时增加了一些其它有价值的功能应用。
- 4) lib_dict: 该库主要实现了 KEY-VALUE 的字典式存储库,该库另外还依赖于 BDB, CDB 以及 tokyocabinet 库。
- 5) lib_tls: 该库封装了 openssl 库,使 lib_acl 的通信模式可以支持 ssl。
1.2、功能模块组成
1.2.1、网络通信库
- 流处理模块(ACL_VSTREAM): 该模块是整个 acl 网络通信最基础的流式通信模块,不仅支持网络流,同时还支持文件流,主要支持:
- 1 按行读数据,兼容 win32 下的 \r\n,同时兼容 UNIX 下的 \n 的结束符
- 2 按行读数据但要求自动去掉尾部的 \n 或 \r\n
- 3 以字符串为分隔符读取数据
- 4 读规定长度的数据
- 5 尝试性读一行数据或尝试性读规定长度数据
- 6 探测网络 IO 状态
- 7 写入一行数据
- 8 按格式符写入数据,类似于 fprintf
- 9 文件流定位操作,类似于 fseek
- 10 一次性写入一组数据,类似于 unix 下的 writev
- 11 将文件截短,类似于 ftrunk
- 12 获取文件大小
- 13 获得当前文件流指针位置,类似于 ftell
- 14 获得文件尺寸
-
15 获得网络流的本地地址及远程地址
-
网络操作模块:该模块主要支持网络服务端监听(支持 TCP/UDP/UNIX 域套接口)、网络客户端连接(支持 TCP/UNIX 域套接口)、DNS 域名查询及结果缓存(支持调用系统 gethostbyname 函数和直接发送 DNS 协议两种方式)、套接口(socket)操作及取本机网卡等功能。
-
非阻塞网络流:支持非阻塞方式连接、读(按行读,规定长度读)、写(写行,写规定长度,写一组数据)等操作。
-
常见网络应用协议库(lib_protocol/lib_acl_cpp): 主要支持常见网络应用协议,诸如:HTTP、SMTP、ICMP,其中 HTTP、ICMP 两个模块实现了阻塞、非阻塞两种通信方式;此外,HTTP 协议在C++版的 lib_acl_cpp 中还支持服务端、客户端两种通信方式,当作为服务端使用时,支持类似于 JAVA HttpServlet 的接口使用方式,当作为客户端方式使用时,支持连接池与集群管理方式,该模块同时支持 cookie、session、HTTP MIME 文件上传、分块传输、字符集自动转换、自动解压缩、断点续传等丰富的功能。
-
常见网络通信库: 支持 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 多进程多线程模型:每个子进程是由线程池中的一组线程处理所有的客户端连接,采用 IO 事件触发方式,只有当连接有数据可读时才会将连接与一个线程进行绑定,线程处理完后立即归还给线程池,这种模型的最大优点是可以用少量的线程便可以处理大 量的客户端连接,而且编程比较简单(相对于非阻塞模型);
- 3 多进程非阻塞模型:每个子进程是由一个单独的非阻塞线程组成,该线程采用完全非阻塞 IO 方式处理外来的大量客户端连接(类似于 nginx/squid/ircd),该模型的优点是处理效率高占用资源少,可以处理大量客户端连接,缺点是编程比较复杂;
- 4 UDP 通信模型:该模型主要为了支持 UDP 网络过程而增加的服务模型;
- 5 解发器模型:该模型的实例主要用来处理一些定时任务的后台服务过程(类似于系统的 crontab)。
服务器框架中的子进程实用采用半驻留服务模型,支持子进程预启动机制、最大最小进程数控制、子进程异常报警、单一进程监听多个地址(可同 时监听TCP/UDP套接字以及 UNIX 域套接字)、子进程安全控制、日志输出至 syslog-ng、多进程TCP连接均匀化;采用配置文件驱动方式,每个服务一个配置文件,方便进程管理及服务进程在线升级。
1.2.4、常用数据结构模块
该模块提供了常见的哈希表(及多种哈希算法)、动态数组、双向链表、平衡二叉树、队列、二分块查找树、256 叉匹配树等数组结构;提供了统一的数据结构遍历方法(采用 acl_foreach)。
1.2.5、 内存操作模块
该模块提供三种内存池模型:
- 1 基本的内存方式:内部封装了系统的 malloc/free API,提供了内存校验等安全措施;该方式同时提供外部注册接口,允许使用者注册自己的内存分配模型;
- 2 内存片(slab) 方式:根据不同的尺寸大小分配多个定长内存链,可以有效地减少内存碎片,大大提升内存分配效率;
- 3 内存链方式:将长度不一的小内存分配在一条内存页上,可以非常有效地使用内存,减少内存浪费。
1.2.6、常用字符串操作模块
支持字符串匹配查找、前(后)向比较、字符串分割、字符串大小写转换、H2B/B2H 转换、URL 编码/解码等功能。
1.2.7、文件目录模块
支持多级目录创建、多级目录扫描、文件句柄缓存等功能,同时在处理多级目录采用循环方式,避免了递归方式时可能的栈溢出的隐患。
1.2.8、读配置文件模块
支持读 name=value 形式的配置文件,value 较长时可以使用反斜杠()折行,采用配置表方式提取配置文件中的配置项。
1.2.9、线程及线程池模块
提供了跨平台的支持 Posix 规范的线程接口(支持WIN32);线程池模块通过多种措施最大程度地减少线程任务分配时的锁冲突(用在 acl 服务器框架中多进程多线程服务模型中)。
1.2.10、数字键的 K-V 磁盘存储模块(zdb)
采取 KEY/VALUE 分块存储方式,因为 KEY 限定为数字类型,只需内存计算便可算出 KEY 的位置,KEY 中存放了 VALUE 的位置,所以对于任何的数据查询只需两次磁盘定位。(本人在和讯做流量统计存储时,使用该种方式替代了BSD、TC 等采用B树的 K-V 存储)
1.2.11、流式解析库
该模块包括 xml、json、rfc2047、mime、base64、uucode、qpcode、charset 等编解码库,这些解码库均采用流式解析方式,适合于多种网络 IO 模型(阻塞/非阻塞TCP、UDP)。
1.2.12、数据库封装库
设计了统一的数据库操作接口及连接池处理方式,目前支持 sqlite/mysql。
1.2.13、文件队列处理库
支持多组目录队列文件的创建、扫描、删除等操作;常用于临时文件队列调度的服务程序中。
二、平台支持及编译
整个工程目前支持 Linux(AS4,5,6, CS4,5,6, ubuntu), Windows, MacOS, FreeBSD, Solaris。
- Linux/UNIX: 编译器为 gcc,直接在终端命令行方式下分别进入 lib_acl/lib_protocol/lib_acl_cpp/lib_dict/lib_tls 目录下,运行 make 命令即可。
- Windows: 可以用 VC2003/VC2008/VC2010/VC2012 进行编译。(如果需要用 VC6/VC2005 编译,可以参考 VC2003 的编译条件)。
当在 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。
三、项目资料
github: https://github.com/zhengshuxin/acl
sourceforge:http://sourceforge.net/projects/acl/
相关技术博客:http://zsxxsz.iteye.com/
acl 工程有大量的测试用例(近200个):https://github.com/acl-dev/acl/blob/master/SAMPLES.md
此外,还几个实用的工具:
1、服务器程序生成向导:https://github.com/acl-dev/acl/tree/master/app/wizard,使用该工具,可以快速地创建网络服务器程序(甚至于 HTTP WEB 服务器程序)
2、全局唯一ID产生器:https://github.com/acl-dev/acl/tree/master/app/gid
3、网络状态监控工具(WIN32):https://github.com/acl-dev/acl/tree/master/app/net_tools
4、TCP 连接分配器:https://github.com/acl-dev/acl/tree/master/app/master_dispatch
5、字符集转换器:https://github.com/acl-dev/acl/tree/master/app/jencode
相关推荐
acl 工程是一个跨平台(支持LINUX,WIN32,Solaris,MacOS,FreeBSD)的网络通信库及服务器编程框架,同时提供更多的实用功能库。通过该库,用户可以非常容易地编写支持多种模式(多线程、多进程、非阻塞、触发器、...
acl 工程是一个跨平台(支持LINUX,WIN32,Solaris,MacOS,FreeBSD)的网络通信库及服务器编程框架,同时提供更多的实用功能库。通过该库,用户可以非常容易地编写支持多种模式(多线程、多进程、非阻塞、触发器、...
cl 工程是一个跨平台(支持LINUX,WIN32,Solaris,MacOS,FreeBSD)的网络通信库及服务器编程框架,同时提供更多的实用功能库。通过该库,用户可以非常容易地编写支持多种模式(多线程、多进程、非阻塞、触发器、UDP...
acl 工程是一个跨平台(支持LINUX,WIN32,Solaris,MacOS,FreeBSD)的网络通信库及服务器编程框架,同时提供更多的实用功能库。通过该库,用户可以非常容易地编写支持多种模式(多线程、多进程、非阻塞、触发器、...
acl 工程是一个跨平台(支持LINUX,WIN32,Solaris,MacOS,FreeBSD)的网络通信库及服务器编程框架,同时提供更多的实用功能库。通过该库,用户可以非常容易地编写支持多种模式(多线程、多进程、非阻塞、触发器、...
acl 工程是一个跨平台(支持LINUX,WIN32,Solaris,MacOS,FreeBSD)的网络通信库及服务器编程框架,同时提供更多的实用功能库。通过该库,用户可以非常容易地编写支持多种模式(多线程、多进程、非阻塞、触发器、...
ACL库,全称为Advanced C Library,是一个为C程序员设计的跨平台库,旨在提供一系列高效且易用的数据处理算法,以及强大的服务器框架。这个库特别适合于开发需要高性能、高并发性和良好扩展性的网络应用程序。在本文...
ACL项目是一个综合性的软件开发项目,其核心是提供一套通用且跨平台的函数库,旨在简化和优化IT领域的多个关键领域。这个项目包含了多种功能模块,如网络通信、服务器框架、进程池和线程池管理,以及通用算法实现。...
acl工程是一个跨平台(支持LINUX,WIN32,Solaris,MacOS,FreeBSD)的网络通信库及服务器编程框架,同时提供更多的实用功能库。通过该库,用户可以非常容易地编写支持多种模式(多线程,多进程,非二进制,异步,...
4. `services`目录:可能包含与后端服务器通信的服务函数。 5. `styles`目录:应用的样式定义。 6. `reducers`和`actions`:如果项目使用Redux进行状态管理,这里会包含应用的状态更新逻辑。 7. `assets`目录:放置...
PHP具有易学易用、跨平台、丰富的库支持和高效的性能等特点,使得开发者可以快速构建复杂的Web应用程序。 2. **云存储技术**:DzzOffice实现了云存储功能,这意味着它能够通过互联网将数据存储在远程服务器上,用户...
3. **Tomcat架构**:Tomcat主要包括几个关键组件,如Catalina(Servlet容器)、 Coyote(连接器,负责处理网络通信)、Jasper(JSP引擎)、Commons Daemon(用于启动和管理Tomcat进程)等。这些组件协同工作,提供了...
Java作为一种跨平台的编程语言,广泛应用于各种领域,尤其是在网络和企业级应用中,其安全性显得尤为重要。本设计将关注两个核心的安全模块,旨在提供一套通用的解决方案,适用于多种应用场景。 首先,我们要理解...
ASP.NET 教学系统是一种基于微软的.NET框架开发的网络教育平台,主要用于提供视频在线播放、课件上传下载等功能。这个系统充分利用了ASP.NET的技术优势,构建了一个高效、安全且用户友好的教育环境。 首先,ASP.NET...
javax.sql.rowset.serial 提供实用工具类,允许 SQL 类型与 Java 编程语言数据类型之间的可序列化映射关系。 javax.sql.rowset.spi 第三方供应商在其同步提供者的实现中必须使用的标准类和接口。 javax.swing 提供...
4. **活动组**: 活动组是Open Group赞助的一个标准组织,负责ActiveX技术的开发、管理和许可协议的发放,旨在促进跨平台的技术合作。 5. **Active Scripting**:这是一种Microsoft技术,允许使用各种语言和固定格式...
1. **Java**: Java是一种面向对象的、跨平台的编程语言,因其“一次编写,到处运行”的特性而广受欢迎。在办公自动化管理系统中,Java主要用于服务器端的业务逻辑处理,如用户认证、数据处理、事务管理等。 2. **...
10. **安全性**:确保系统符合 OWASP(开放网络应用安全项目)的安全最佳实践,包括CSRF(跨站请求伪造)防护、XSS(跨站脚本)防御、HTTPS加密通信等。 开发在线订单PHP订单系统的过程中,开发者需要具备扎实的PHP...
javax.sql.rowset.serial 提供实用工具类,允许 SQL 类型与 Java 编程语言数据类型之间的可序列化映射关系。 javax.sql.rowset.spi 第三方供应商在其同步提供者的实现中必须使用的标准类和接口。 javax.swing 提供一...