现在成熟的开发库与开发框架有很多,所以平时我们在开发自己的应用程序时一般直接拿来用就可以了,所以当我先是开发出 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. spark accumulator累加器

    java /** * accumulator可以让多个task共同操作一份变量,主要进行多个节点对一个变量进行共享性的操作,accumulator只提供了累加的功能 * 只有driver可以获取acc ...

  2. WCF客户端C#代码 配置config文件

    不多说了,直接上代码吧.... 服务端Web.config文件中bindings配置 <bindings> <wsHttpBinding> <binding name=& ...

  3. css3中的渐变小总结

      = 导航   顶部 线性渐变 径向渐变 透明度 边框 阴影   顶部 线性渐变 径向渐变 透明度 边框 阴影 系列教程 CSS3 Gradient分为linear-gradient(线性渐变)和r ...

  4. 【从翻译mos文章】采用高速全扫描索引(index ffs) 为了避免全表扫描

    采用高速全扫描索引(index ffs) 为了避免全表扫描 参考原始: Index Fast Full Scan Usage To Avoid Full Table Scans (Doc ID 701 ...

  5. Java设计模式透析之 —— 单例(Singleton)

    写软件的时候经常需要用到打印日志功能,可以帮助你调试和定位问题,项目上线后还可以帮助你分析数据.但是Java原生带有的System.out.println()方法却很少在真正的项目开发中使用,甚至像f ...

  6. 2-2 Consul注册注销流程

    铺垫,创建健康检查方法,Consul服务器隔一段时间请求一下webapi里的一个方法,如果这个方法没有问题,则证明这个webapi还在正常工作,这个webapi提供的服务就存在.如果方法没有返回,或者 ...

  7. ASP.NET Core 设置和初始化数据库 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core 设置和初始化数据库 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 设置和初始化数据库 上一章节中我们已经设置和配置好了 EF ...

  8. 转义及编码(\u, \x)

    首先前面的 \表示转义, \x:只是 16 进制的意思,后边跟两位,则表示单字节编码: \d:十进制:\o:八进制: 对于 \xaa ⇒ chr(0xaa) ⇒ chr(16*a+a) \u:unic ...

  9. WPF中StringFormat的用法--显示特定位数的数字

    原文:WPF中StringFormat的用法--显示特定位数的数字 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/huangli321456/art ...

  10. ThreadingTest(线程测试)领先的白框进入这个行业

    测试一直是黑色的,白点.在一般情况下,因为白盒测试需要逻辑思维能力是比较高的技术要求比一般开发商的项目经验和谨慎甚至更高,和较长的测试时间,用于单元测试,昂贵的工具,因此,国内企业普遍忽视白盒测试.这 ...