现在成熟的开发库与开发框架有很多,所以平时我们在开发自己的应用程序时一般直接拿来用就可以了,所以当我先是开发出 C 语言版的 acl 框架库时有人认为是这个轮子是否值得发明,而当我再开发出基于 acl 的 C++ 版的 acl_cpp 库时,自然更有人指出这是重复发明了。其实就是否应该重复发明轮子的问题,我并不想从理论上来说明什么,只是想从实践角度来说明发明这两个轮子的意义。

一、acl的含义是什么?

acl 最早叫 Advanced C Library,因为它确实比标准 C 库提供了更多有价值的功能,同时屏蔽了底层 API 的一些容易出错的地方;后来觉得似乎叫 a C library 也不错。

二、acl最早是怎么产生的?

在早期写一些网络服务器程序时,对于网络读写操作,每次都得要调用系统 API 中的 read/write 操作,不仅容易出错,而且写起来效率低下,考虑到网络流的读操作最常用的无非就是读一行、读 N 个字节之类的操作,写操作也主要以写一行数据或写 N 个数据为主,而如果直接使用 read/write 两个 API 来实现,则就会麻烦许多,所以不如写一个简单实用的库,在参考了 Stevens 的网络编程的书以及 Postfix 中有关流的实现后,也实现了一个网络流的读写库,后来不断完善这个功能库,并在应用程序中到处拷贝。后来觉得拷贝实在麻烦,于是编成了静态库。

三、acl是如何演变的?

随着时间的推移,觉得应该增加更多的功能库,所以就有了字符串处理函数库(ACL_VSTRING)、常用的数据结构(哈希表、动态数组等),其中很多库都是由 Postfix 中的代码修改而来。其中最有价值的改变是移植 Postfix 的服务器框架到 acl 库中,这个移植过程是艰辛而漫长的,但最终的结果却是令人满意的,从当初到如今,笔者依然认为 Postfix 的服务器框架是所见过的服务器程序中(Apache,Squid,Nginx,Ircd,etc,这些服务器除了 Apache 的一些代码最终转为 apr 库外,其它的服务器程序都是高度集成的,很难分离)最强大的:安全、稳定、高效。至此,acl 库最基础的东西有了,相较于 glib 这些仅提供函数功能库的项目而言,acl 框架库不仅有常用的函数功能库,而且有象 Postfix 这样高度抽象的服务器框架。其实经常用 JAVA 开发的程序员可能无法想象,当用 C 进行开发时,开发一个普通的服务器程序是多么地麻烦,尤其是十年之前的国内,有了 acl 库从 Postfix 移植而来的服务器框架,开发服务器程序这项工作变得异常简单了。

然后经过自己的日积月累,又增加了线程池、非阻塞 IO、数据库操作(主要是 mysql)等各种库,因为有段时间一直在修改 Squid,所以对于 Http 协议比较熟悉,因此而产生了 HTTP 协议库,后来偶然的项目因素,又增加了 PING 协议库。

2008年,公司要求开发 WINDOWS 下的针对 FLASH 视频的 P2P 加速项目(主要是觉得视频太费带宽了,谁叫中国的带宽这么贵呀),而当时的 acl 库虽然在 UNIX 环境已经相对成熟了,但还不支持 WIN32,而做 P2P 项目也确实需要网络通信及 HTTP 协议解析,于是花最短的时间将 acl 的网络通信及 HTTP 协议部分移植到 WINDOWS 平台,从而保证了 P2P 项目的完成(现在在网上搜索“和讯风驰”应该还能看到这个P2P的视频加速软件)。既然移植了一部分 acl 中的库,于是痛下决心,经过无数个夜晚的煎熬,终生把 acl 库中的绝大部分函数库(除服务器框架外,目前也是如此)移植到 WINDOWS 平台上了,然后再经过漫长的完善与修改,acl 库现在终于可以支持 win32/linux 平台了,而且也相对稳定了。当然,现在在 acl 库中还有 xml/json 数据格式的流式解析库,丰富的网络功能库(包括DNS 解析、取网卡信息、监听服务、远程连接服务等),事件引擎库(支持select/poll/epoll/kqueue/devpoll/iocp/win32 msg),编码库(包括字符集编码,xml/url 编码,简繁体转换等),单元测试库等。

四、acl_cpp库的演变过程

自从有了 acl 的库,本人及一些同事在写网络服务器程序时可以非常容易地实现,因为 acl 库有常用的数据结构,所以也不需要使用类似于 glib 第三方的 C 函数库。但后来觉得用纯 C 开发程序还是工作效率较低,所以就尝试着把 acl 库中一些功能库用 C++ 语言进行二次封装,于是便产生 acl_cpp 库,acl 中确实有一些比较有特色的函数库,这些基本都在 acl_cpp 中得到体现。当然 acl_cpp 中还有一些额外的功能库:邮件 mime 流式解析库、handlersocket 库,memcached 客户端库、IPC 通信库、字符集转换库(封装了 iconv)、数据压缩库(封装了 zlib)等多种函数库。acl_cpp 并不是对 acl 库的简单的封装,很多地方都做了优化和扩展,同时在兼顾运行效率的前提下更注重设计。

另外,acl_cpp 也是跨平台的,同时支持 linux 和 win32 两个平台。

五、例子

为了验证 acl 及 acl_cpp库的功能性及健壮性,也写了大量的例子,从不同角度测试两个库,同时绝大多数例子都在 valgrind 检查过。

六、将来的 acl&acl_cpp 库的发展规划

将来 acl 和 acl_cpp 两个库会继续扩充与发展,只是发展的角度不同,acl 库更注重底层运行效率,acl_cpp 则更注重应用的功能性及开发易用性,此外,希望能开发出一些基于 acl&acl_cpp 框架库更有价值的应用出来,供广大网友使用。对了,jaws 就是一个比较简单的支持 HTTP 协议的 web 服务器及 web 代理服务器(目前和讯的WEB简繁体转换网关用的就是它),有兴趣的朋友可以下载试试。

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

https://my.oschina.net/u/568966/blog/309578

ACL 我为什么要发明一个轮子?的更多相关文章

  1. 在python3.6下 发明一个类似python3.7 dataclass数据类,不用在 __init__中self.xx

    虽然我用3.6,但我在2.7转3.6时候,把3.3 3.4 3.5 3.6的变化都看了一次,虽然已经忘了哪些变化.同时也关注3.7 3.8的变化,3.7中就有1个数据类印象深刻,因为之前在定义这种类时 ...

  2. 又一个轮子--QMapper

    1 前言 我喜欢造轮子,一是造的时候就是深刻学习的时候,二是造着造着,说不定某天比世面上的其它轮子都要好呢.比如造过Networksocket,也造过WebApiClient,现在我也要造一个Mapp ...

  3. dva的effect那么难用,自己造一个轮子吧

    背景 对于dva这个开发框架,国内从事react的前端工程师多半不会感到陌生,dva完善的开发体系和简单的api,让其被广泛运用到实际工作中.我所在的公司也是长期使用dva作为基础的开发框架,虽然好用 ...

  4. 造一个轮子然后安装到pypi上

    之前写了一个爬虫的包,主要是根据自己写爬虫的情况总结一下. 因为每次都要重复写一些代码,所以提炼出来,类似一个框架的样子吧. 开始是放在自己的项目里引用,但如果换了一个项目,就得重新拷一遍,很麻烦. ...

  5. 不用asp.net MVC,用WebForm照样可以实现MVC(请看最后一句话)

    在<避开WebForm天坑,拥抱ASP.Net MVC吧>这篇博客中我讲到了ASP.net WebForm由于一些先天的“诱导犯罪”的缺陷,现在用ASP.net MVC的公司越来越多.但是 ...

  6. Java class文件分析工具 -- Classpy

    Classpy Classpy是一个图形化的class文件分析工具,功能和javap类似,界面主要參考了Java Class Viewer: 为什么要又一次创造轮子? 写这个工具花了将近一周的时间.那 ...

  7. 不用asp.net MVC,用WebForm照样能够实现MVC

    在<避开WebForm天坑,拥抱ASP.Net MVC吧>这篇博客中我讲到了ASP.net WebForm由于一些先天的"诱导犯罪"的缺陷,如今用ASP.net MVC ...

  8. 如何成为Android高手

    要成为Android 高手并不是一件容易的事情.并不是很多人想象的 能够飞快的写出几行漂亮的代码去解决一些困难的问题 就是Android 高手了.真正的Android 高手需要考虑的问题远远不是写些漂 ...

  9. Reactor和Proactor模型

    背景 前面介绍了I/O多路复用模型,那有了I/O复用,有了epoll已经可以使服务器并发几十万连接的同时,还能维持比较高的TPS,难道还不够吗?比如现在在使用epoll的时候一般都是起个任务,不断的去 ...

随机推荐

  1. 【9705】&&【a801】细胞

    Time Limit: 10 second Memory Limit: 2 MB 问题描述 一矩形阵列由数字1~9代表细胞,细胞的定义是沿细胞数字上下左右如果还是细胞数字则为同一细胞,求给定矩形阵列的 ...

  2. Android Studio如何打jar包

    前言 公司经常和客户提供SDK,提供一个jar包sdk是一件很平常的事.Eclipse 有图形界面和向导供开发者将一个项目导出为jar包,相对来讲是比较简单的,切换到Android Studio后,则 ...

  3. 利用navicat写mysql的存储过程

    最近项目经理让我给新的活动的预留一个插入红包和查看详情的sql,方便在项目出问题的做一些紧急操作,我想了下这里面还涉及到挺多逻辑和挺多表的一句句查也不方便啊,干脆写到存储过程里,于是开始在navica ...

  4. matlab 格式化文本文件的解析

    比如这样一种格式化的文本文件,文件说明及下载地址:/pub/machine-learning-databases/statlog/german/ 的索引 fid = fopen('german.dat ...

  5. 什么是“恶意代码”——————【Badboy】

    恶意代码是一种程序,它通过把代码在不被察觉的情况下镶嵌到还有一段程序中,从而达到破坏被感染电脑数据.执行具有入侵性或破坏性的程序.破坏被感染电脑数据的安全性和完整性的目的. 按传播方式,恶意代码能够分 ...

  6. WPF中PasswordBox控件的Password属性的数据绑定

    原文:WPF中PasswordBox控件的Password属性的数据绑定 英文原文:http://www.wpftutorial.net/PasswordBox.html 中文原文:http://bl ...

  7. IIS执行原理

    IIS执行原理   服务器的监听(IIS6.0+版本) 当请求到达服务器时,请求最终会到达TCPIP.SYS驱动程序,TCPIP.SYS将请求转发给HTTP.SYS网络驱动程序的请求队列中(可以理解为 ...

  8. JSON.parse(JSON.stringify()) 实现对对象的深度拷贝,从而互不影响

    JSON.parse(JSON.stringify({"key": "value"})) 根据不包含引用对象的普通数组深拷贝得到启发,不拷贝引用对象,拷贝一个字 ...

  9. Android-apktool反汇编异常-Input file (XXX) was not found or was not readable.

    问题描述: 原因: 在apptool 2.0以后命令发生了变化,不能再使用 apktool d <apk_path> <outfile_path> 解决方法:解决方法: 使用命 ...

  10. 图像处理与计算机视觉的 topics

    光学图像(optical image): the apparent reproduction of an object, formed by a lens or mirror system from ...