`
zsxxsz
  • 浏览: 451090 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论
阅读更多

一、acl 是什么?

 

  其实是一个很简单的问题,acl 的英文字母 advanced C library 的缩写(当然,您也可以认为是 a C library 的缩写)。也许有人会问:"现在有这么多C的函数库,为何还费这么大劲再写一个?"。的确,现在开源的 C 函数库真是太多了,比如:glib(这是一个gnome工作组开发维护的库,开始也是为了gnome界面用,后来发展成通用的 C 函数库),libevent(这是UNIX平台下一个封装了 select/poll/epoll/kquue 等的库,主要是为了应对大并发网络程序的开发),pthread-win32(这是在win32平台下按Posix接口标准写的库,其中google的 chrome 浏览器就用到了它),当然还有更为著名的 C++ 函数库 ACE(还有自称比ACE还好的C++库ICE)。每个库都有各自的特点,都能满足不同的应用需求。但是,当我在开发一个希望能跨平台的、支持常见数据算 法、有很好的服务器框架、支持线程池/进程池、支持同步/异步通信、简单易用可扩展、支持HTTP协议、ICMP协议、DNS协议等的应用时,就不得不组 合各个函数库,有时还得为这些库的不兼容性做些努力。

 

二、acl 是怎么来的?

 

  因此写一个通用简单的 C 库就成为了一个小小的目标,开始 acl 的名字叫 util,生成的库名叫 lib_util.a,并且该库的函数大部是从 Postfix 借鉴过来的,也就是说初期没有 Postfix 就不会有 acl。Postifx 虽然只是一个邮件的 mta(现在国内的很多大的网站的MTA就是由 Postfix 修改而成,象 sohu, 263, sina, qq 等的邮件系统),但其中的函数库却设计的如此巧夺天工, 虽然是用 C 语言写成,但其设计思想却可与 C++ 媲美,Wietse Venema   不愧为世界级架构师,否则IBM也就不会请他来写 Postfix 了,在读了 Postfix 的源码后,本人将其中一些具有通用性的函数库(象vstring.c, htable.c, ring.c, etc)抽出来,构成了 lib_util.a 的主体部分。随着时间的演变, lib_util 里加的函数库越来越多,并且在与其它函数库连用时很容易造成命名冲突,因为 C 语言没有象 C++ 命名空间的概念,一般的做法都是在函数名前加 xxx 前后缀来区分。所以,是应该重新给 lib_util 起个名字的时候了,象 tcl(turbo c library), 等名字都被用过,但总觉得有点别扭,有一天突然想到用 acl 似乎也不错,嗯,advanced C library ---高级 C 库,意思是应该比 ANSI C 的标准库提供更为高级的功能。acl 名称确定下来后,于是把函数的名称都加了小写的 acl_ 前缀,结构、宏、全局定义的名称前都加了 ACL_ 前缀,确实是个不错的命名。

 

三、acl 的目录划分

 

  开始时 acl 的目录规划比较简单,只有 src/ 和 include/ 两个目录,所有的源代码及头文件都分别放在这两个目录下,当然这也主要是因为 Postifx 的 util/ 目录下是通用的函数库的原因(当初就是想把 Postfix 的 util/ 下的库单独抽出来),当发现函数库越来越多时,发现将所有源代码放在同一目录下维护起来是多么地麻烦,所以想应该规划一下目录结构了,于是乎,划分了几个 一级目录:stdlib/, event/, aio/, thread/ 等目录,其中在 stdlib/ 目录下还有 common/, memroy/, string/, configure/ 等二级目录。这样,acl 的体系结构算是基本形成了。现在 acl 的目录划分基本是以功能为标准的,各个目录的主要功能如下:

 

3.1 src 目录

 

3.1.1 init/ : 主要用于初始化 acl 基础库

 

3.1.2 stdlib/ : 是一些比较基础的功能函数库,在 stdlib/ 根目录下主要包括一些有关日志记录、网络/文件流处理、VSTRING缓冲操作等功能函数;在 stdlib/ 下还有二级目录,如下:

3.1.2.1 common/ : 该目录主要为一些常用的数据结构及算法的功能函数库,象哈希表、链表、队列、动态数组、堆栈、缓存、平衡二叉树、模式匹配树等;

3.1.2.2 memory/ : 该目录主要包含与内存操作相关的函数库,象内存基础分配与校验、内存池管理、内存切片管理等;

3.1.2.3 filedir/ : 该目录主要包含与目录遍历、目录创建等相关的库;

3.1.2.4 configure/ : 该目录主要包含配置文件的分析库;

3.1.2.5 iostuff/ : 该目录主要包含一些常用的IO操作的函数库,象读/写超时、设置IO句柄的阻塞模式等;

3.1.2.6 string/ : 该目录主要包含一些常用的字符串操作的库,提供了比标准C更灵活高效的字符串操作功能;

3.1.2.7 debug/ : 主要用于协助调试内存的泄露等功能;

3.1.2.8 sys/ : 主要是与不同操作系统平台相关的API的封装函数库;

 

3.1.3 net/: 是与网络操作相关的函数库,包含网络监听、网络连接、DNS查询、套接口参数设置等功能;

3.1.3.1 connect/ : 主要是与网络连接相关的函数库,包含网络连接、域套接口连接等;

3.1.3.2 listen/ : 主要是与网络监听相关的函数库,包含网络监听、域套接口监听等;

3.1.3.3 dns/ : 主要是与DNS域名查询相关的函数库,包含对 gethostbyname 等接口的封装、按RFC1035标准直接发送UDP包方式进行查询等功能;

 

3.1.4 event/ : 主要封装了 select/poll/epoll/kqueue/devpoll 等系统API接口,使处理网络事件更加灵活、高效、简单,另外还包含定时器接口,acl 中的很多网络应用都会用到这些接口,象 aio、master 等模块;

 

3.1.5 aio/ : 主要包含网络异步操作的功能函数,该套函数库在处理高并发时有非常高的效率,而且提供了比基础API更为高级的调用方式,比使用象 libevent 之类的函数库更为简单,而且是线程安全的;

 

3.1.6 msg/ : 主要包含了基于线程的消息事件及基于网络的消息事件功能;

 

3.1.7 thread/ : 主要是封装了各个OS平台下的基础线程API,使对外接口保持一致性,消除了平台的差异性,同时还提供了半驻留线程池的函数库,以及对于线程局部变量的扩展;

 

3.1.8 db/ : 主要是一些与数据库有关的功能库,定义了一个通用的数据库连接池的框架(并且实现了mysql的连接池实例);一个简单的内存数据库(由哈希表、链表、平衡二叉树组合而成);ZDB数据存储引擎,这是一个高效的基于数字键的存储引擎;

 

3.1.9 proctl/ : win32 平台下父子进程控制功能库;

 

3.1.10 code/ : 常见编码函数库,包括 base64编解码、URL编解码以及一些汉字字符集编码等;

 

3.1.11 unit_test/ : 包含有关进行 C 语言单元测试的功能库;

 

3.1.12 xml/:是一个流式的 xml 解析器及构造器,可以支持阻塞及阻塞式网络通信;

 

3.1.13 json/:是一个流式的 json 解析器及构造器,可以支持阻塞及阻塞式网络通信;

 

3.1.14 master/: 是在 UNIX 环境下支持多种服务器模式的服务器框架,目前主要支持多进程模式、多进程多线程模式、多进程非阻塞模式以及多进程触发器模式;

 

四、acl 是如何跨平台的?是如何支持WIN32平台的?

 

  在开发 acl 库时是完全基于 linux 平台的,后来公司要做一个P2P的项目,需要在WIN32下开发客户端程序,主要需要 acl 中的 HTTP 协议通信及协议解析部分,所以为了项目需要, acl 中的HTTP协议库及HTTP协议库所依赖的一些函数库被移植至WIN32下。由此,觉得 acl 应该有一个 win32 版本,所以本人花费数周N个晚上,将 acl 库中的几乎所有函数库都移植至WIN32下(当然目前仅有master服务器框架还没移植),后来还移植至FreeBSD、Solaris(x86)上 (从LINUX移植至这些UNIX平台相对容易些),主要还是在移植至WIN32平台时比较费劲,因为WIN32的API与UNIX及POSIX的真是相 差太远了,感觉一点就是在WIN32下直接用API编程还是挺辛苦的,有时本来一个非常简单的IO读写,在WIN32下却需要N个参数,并且微软的API 还有一个特点,就是很多API都有一个Ex(扩展)版,看来是它们的工程师在当初设计API时发现不够用又加进去的。

  另外,微软的编译器版本比较多,有VC6,VC2002,VC2003,VC2005,VC2008,现在还有VC2010,各个编译器之间还 有一些差别,要想完全支持这些编译器工作量是巨大的,所以acl 目前可以用 VC6, VC2003, VC2008 编译,说起仅支持这些编译器还是有原因的,VC6做为一个老牌的编译器,存在的历史时期比较久,自 Borland 的BC被VC打败后,微软就在VC编译器无所作为了,N年未大改过VC6,说实在话,这个VC6也真是够难用的(当然现在还有许多人在用它),后来微软终 于出VC2002,算是VC6的一个大版本升级,终于变得“比较”好用了,不过VC2002似乎存在不少BUGS,所以微软又推出了VC2003,这个版 本本人觉得还是很不错的,可以说是VC6的终极版,因为VC2005后,微软在VC编译器的改动就比较大了,显著一点就是比较浪费系统资源了,对于象我这 样用惯 vi 编辑程序的程序员,机器配置并不需要太高,而用VC2005时明显机器的CPU及内存不够用的,本人感觉 VC6, VC2002,VC2003 属于一个系列的,标准C库变动不是特别大,但到了VC2005后就变动比较多了,比如在VC2003时一般用 snprintf 就可以了,但用VC2008时,你会发现微软“自作聪明”地提示你应该用 snprintf_s ,而且多了几个参数,为了支持VC2008,acl库里还是做了不少改动。但本人还是比较偏爱VC2003,它仅不会象VC2005/VC2008那样费 资源,又比VC6好用,而且没有VC2002那么多BUGS,所以 acl 库在WIN32的主推编译器是VC2003:)。

 

五、acl 从哪些开源软件中汲取了经验?

  首先得感谢 Postfix(2002-2005本人在方标以此作为方标邮件系统的MTA模块), 里面良好的框架设计及编码风格是 acl 始终追求的;squid(2005-2007年本人在和讯改造SQUID以适应和讯的网络访问需求)/nginx,这两款HTTP代理加速软件在HTTP协议处理方面给本人了很多启示;ircd 是一个比较“古老”的聊天服务器(2000-2002年本人在263做的263  web聊天室的后台服务器就是基于 ircd),也是本人最早接触的服务器程序,而且同 squid/nginx 一样是非阻塞通讯模式。

 

个人微博:http://weibo.com/zsxxsz

acl 下载

acl 的编译与使用

github:https://github.com/zhengshuxin/acl

bbs:http://www.aclfans.com

更多文章

QQ 群:242722074

2
0
分享到:
评论
5 楼 zsxxsz 2012-06-27  
mathgl 写道
既然你提到ice。 稍微说一下。ice其实严格来说算是中间件,不是什么网络的库。

它是用了一种比较方便的方式提供了rpc的调用以及一些其他传输方案。

但是如果要用来写一个http server,这无能为力。

boost::asio 是属于这种应用于网络的库。

ACE的学习曲线比较陡,而且体积也太大了一些。

boost::asio 使用模板太多,这种风格未必人人喜欢。

国产的还有 mudou (linux only)

是的,我也曾学习过ACE,甚至还买过三本经典的书,学习门槛比较高,为了完成一个简单的功能,却要学习很多东西,不值;
boost,全是模板,看着就晕;
acl 主要是为了给C程序员提供一个方便编程的框架库,所谓框架是指里面有常见服务器编程的框架,所谓库是指里面有大量实用的库;另外,还提供了基于 acl 的 C++ 版本,也是为了实现快速开发用的,里面没有特别复杂的设计模式,也没有大量的模板,一切都是从实际需求出发,希望能满足一些常见的应用开发。
4 楼 mathgl 2012-06-27  
既然你提到ice。 稍微说一下。ice其实严格来说算是中间件,不是什么网络的库。

它是用了一种比较方便的方式提供了rpc的调用以及一些其他传输方案。

但是如果要用来写一个http server,这无能为力。

boost::asio 是属于这种应用于网络的库。

ACE的学习曲线比较陡,而且体积也太大了一些。

boost::asio 使用模板太多,这种风格未必人人喜欢。

国产的还有 mudou (linux only)
3 楼 mathgl 2012-06-19  
zsxxsz 写道
acl 也支持 iocp,写 WIN32 环境的服务端也是可以的,建议您使用 acl_cpp(http://sourceforge.net/projects/aclcpp/),编写服务端程序更简单,可以参考 acl_cpp/samples/master_xxx 例子编写


很好,我这两天用用看。

我比较想找一个 能用的iocp based的库。(但是我不想用boost asio)
2 楼 zsxxsz 2012-06-19  
acl 也支持 iocp,写 WIN32 环境的服务端也是可以的,建议您使用 acl_cpp(http://sourceforge.net/projects/aclcpp/),编写服务端程序更简单,可以参考 acl_cpp/samples/master_xxx 例子编写
1 楼 mathgl 2012-06-19  
现在acl 对 iocp的支持如何? 能否应用于生产环境 (我指用在服务端)

相关推荐

    cisco-ACL介绍配置

    ### cisco-ACL介绍配置 #### 一、访问控制列表(ACL)概述 访问控制列表(Access Control List,简称ACL)是一种重要的网络安全管理工具,在Cisco路由器等网络设备中被广泛使用。ACL是一系列预定义规则的集合,这些...

    扩展ACL故障处理与优化扩展ACL介绍.pptx

    **扩展ACL故障处理与优化** 扩展ACL,全称为Extended Access Control List,是网络设备用于进行精细化流量控制的一种机制。它允许管理员根据多种条件来定义过滤规则,包括但不限于源IP地址、目的IP地址、IP协议类型...

    什么是ACL.pdf

    ACL介绍 **定义** 访问控制列表(ACL)是一组由一条或多条规则组成的集合。每条规则都是一个描述报文匹配条件的判断语句,包括但不限于报文的源地址、目的地址、端口号等。简单来说,ACL就是一种报文过滤器,它...

    自反ACL和基于时间的ACL配置实例详解

    #### 二、基于时间的ACL介绍 基于时间的ACL允许网络管理员根据特定的时间段来控制网络流量。这在需要按工作日、周末、夜间等不同时间段执行不同安全策略的情况下非常有用。例如,可以设置规则,在非工作时间内阻止...

    华为 NE05E, NE08E V300R005C10SPC100 特性描述 - ACL

    3.1 ACL 介绍 ACL 是一系列基于不同条件的规则集合,如源IP地址、目的IP地址、端口号和协议类型等。这些规则用于判断报文是否符合预设的条件,从而决定是否允许其通过网络设备。ACL 提供了一种机制,让管理员可以...

    华为 NE05E&NE08E V300R003C10SPC500 特性描述 - ACL

    **3.1 ACL 介绍** ACL 是 Access Control List 的中文名称,它由一系列条件语句组成,这些语句可以是“允许”或“拒绝”的规则。通过这些规则,网络设备可以判断是否执行用户指定的动作,如允许或阻止特定类型的...

    ACL权限介绍.pdf

    **ACL权限介绍** 在计算机系统中,访问控制列表(Access Control List,简称ACL)是一种用于精细化权限管理的技术,尤其在Linux和Unix系统中被广泛使用。传统的Linux权限模型基于所有者(owner)、用户组(group)...

    Laravel开发-laravel-acl

    ### Laravel-acl介绍 "Laravel-acl"是一个扩展,它允许开发者为不同的用户分配角色,并为每个角色定义一组权限。这使得开发者能够轻松地控制用户对特定资源的访问,从而实现更为精细的权限控制。例如,管理员可以...

    华三交换机acl 配置

    通过以上介绍,我们可以看出,无论是基本ACL还是高级ACL以及二层ACL,在华三交换机中都有其独特的作用和应用场景。正确配置ACL不仅可以提高网络安全性,还可以优化网络性能,为用户提供更好的体验。

    ACL详解视频7讲.zip

    总的来说,这7个视频将深入浅出地介绍ACL的基本概念、配置方法、应用场景及常见问题,适合网络管理员和对网络安全感兴趣的初学者学习。通过学习,你将能够掌握如何利用ACL有效地管理和保护你的网络环境。

    华三ACL命令大全华三ACL命令大全_华三交换机查看型号命令

    通过以上介绍可以看出,H3C MSR系列路由器提供了丰富的ACL配置命令,如`display acl resource`、`display time-range`以及`time-range`等,这些命令可以帮助网络管理员有效地管理和配置路由器的ACL资源和时间范围,...

    cisco_acl配置手册

    本文将基于提供的“cisco_acl配置手册”文件内容,深入解析Cisco ACL的配置原理与实践,重点介绍ACL的处理流程、类型、配置示例及应用技巧。 ### ACL的处理流程与特点 #### 语句排序与隐含拒绝 ACL的处理遵循严格...

    ACL-VPP.doc

    VPP Input ACL Software Functional and Design Specification, VPP ACL功能介绍和实现原理

    HUAWEI NE20E-S2 综合业务承载路由器 V800R011C10 特性描述 - IP 业务

    - ACL介绍:ACL是一种用来定义一系列访问规则来控制数据流的工具,文档会解释其在路由器中的作用。 - ACL原理描述:包括ACL的基本概念和匹配过程,说明了如何根据数据包的特征来决定是否允许数据包通过。 - ACL...

    自反ACL cisco配置示例

    本文将对自反ACL Cisco 配置进行详细的介绍,涵盖自反ACL 的概念、操作、特征和配置示例。 1. 自反ACL 概念 自反ACL(Reflexive ACL)是Cisco IOS 版本11.3 中引入的一种访问控制列表(ACL),它可以 dynamicaly ...

    H3C交换机 典型配置举例-6W100-ACL典型配置举例

    本文将详细介绍H3C交换机中的ACL(Access Control List,访问控制列表)典型配置举例,包括允许指定的主机访问网络和拒绝指定的主机访问网络两种配置举例。 首先,ACL是一种访问控制机制,可以根据不同的网络协议、...

Global site tag (gtag.js) - Google Analytics