ACL 我为什么要发明一个轮子?
现在成熟的开发库与开发框架有很多,所以平时我们在开发自己的应用程序时一般直接拿来用就可以了,所以当我先是开发出 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简繁体转换网关用的就是它),有兴趣的朋友可以下载试试。
https://my.oschina.net/u/568966/blog/309578
ACL 我为什么要发明一个轮子?的更多相关文章
- 在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个数据类印象深刻,因为之前在定义这种类时 ...
- 又一个轮子--QMapper
1 前言 我喜欢造轮子,一是造的时候就是深刻学习的时候,二是造着造着,说不定某天比世面上的其它轮子都要好呢.比如造过Networksocket,也造过WebApiClient,现在我也要造一个Mapp ...
- dva的effect那么难用,自己造一个轮子吧
背景 对于dva这个开发框架,国内从事react的前端工程师多半不会感到陌生,dva完善的开发体系和简单的api,让其被广泛运用到实际工作中.我所在的公司也是长期使用dva作为基础的开发框架,虽然好用 ...
- 造一个轮子然后安装到pypi上
之前写了一个爬虫的包,主要是根据自己写爬虫的情况总结一下. 因为每次都要重复写一些代码,所以提炼出来,类似一个框架的样子吧. 开始是放在自己的项目里引用,但如果换了一个项目,就得重新拷一遍,很麻烦. ...
- 不用asp.net MVC,用WebForm照样可以实现MVC(请看最后一句话)
在<避开WebForm天坑,拥抱ASP.Net MVC吧>这篇博客中我讲到了ASP.net WebForm由于一些先天的“诱导犯罪”的缺陷,现在用ASP.net MVC的公司越来越多.但是 ...
- Java class文件分析工具 -- Classpy
Classpy Classpy是一个图形化的class文件分析工具,功能和javap类似,界面主要參考了Java Class Viewer: 为什么要又一次创造轮子? 写这个工具花了将近一周的时间.那 ...
- 不用asp.net MVC,用WebForm照样能够实现MVC
在<避开WebForm天坑,拥抱ASP.Net MVC吧>这篇博客中我讲到了ASP.net WebForm由于一些先天的"诱导犯罪"的缺陷,如今用ASP.net MVC ...
- 如何成为Android高手
要成为Android 高手并不是一件容易的事情.并不是很多人想象的 能够飞快的写出几行漂亮的代码去解决一些困难的问题 就是Android 高手了.真正的Android 高手需要考虑的问题远远不是写些漂 ...
- Reactor和Proactor模型
背景 前面介绍了I/O多路复用模型,那有了I/O复用,有了epoll已经可以使服务器并发几十万连接的同时,还能维持比较高的TPS,难道还不够吗?比如现在在使用epoll的时候一般都是起个任务,不断的去 ...
随机推荐
- Android项目如果要将自己写的类写成要单独打成jar包?
需求条件: 自己没做过android,公司android开发临时有事请假了,老板说让我研究研究,反正都是java.我心里"XXXXXX".这篇用来自己做个记录,老手请略过,Andr ...
- 云主机启动Node服务后,关闭控制台,无法访问的问题
之前一直用node app.js操作,开启服务后,关闭控制台,仍然可以正常访问我的网站.但昨晚新买腾讯云的服务器后,发现关闭控制台后,就无法访问网站了.然后给腾讯云发了个工单.腾讯云的工程师给了一篇技 ...
- .net remoting 抛出异常
原文:.net remoting 抛出异常 本文告诉大家如何在使用 .net remoting 的时候,抛出异常. 所有在远程软件运行的类,如果需要传输到本地,都需要继承 MarshalByRefOb ...
- Bit error testing and training in double data rate (ddr) memory system
DDR PHY interface bit error testing and training is provided for Double Data Rate memory systems. An ...
- No_Sql总结
NoSQL简介 NoSQL(NoSQL = Not Only SQL ),意即"不仅仅是SQL",是对不同于传统的关系型数据库的数据库管理系统的统称.在现代的计算系统上每天网络上都 ...
- uva 11552 Fewest Flops 线性dp
// uva 11552 Fewest Flops // // 二维线性dp // // 首先,在该块必须是相同的来信.首先记录每块有很多种书 // 称为是counts[i]; // // 订购f[i ...
- react 父组件向子组件传递函数
这段时间一直在使用react,由于这react是单向数据绑定,总感觉有点不适用,毕竟之前一直都在使用angular,但学习还是要继续,做了一个迭代的项目,都差点忘记要总结一下这个react了,现在可以 ...
- Android程序猿必掌握的sqlite数据库连表查询
SQL查询的基本原理:两种情况介绍. 第一. 单表查询:依据WHERE条件过滤表中的记录,形成中间表(这个中间表对用户是不可见的):然后依据SELECT的选择列选择对应的列进行返回终于结果. 第二 ...
- 构建自己的PHP框架(视图装载)
完整项目地址:https://github.com/Evai/Aier 视图装载类要做的工作其实很简单: 1. 根据视图名称找到视图文件,支持文件夹 2. 更加方便,更加优雅地把变量的值传递进视图 本 ...
- Matlab随笔之矩阵入门知识
原文:Matlab随笔之矩阵入门知识 直接输入法创建矩阵 – 矩阵的所有元素必须放在方括号“[ ]”内: – 矩阵列元素之间必须用逗号“,”或空格隔开,每行必须用“;”隔开 – 矩阵元素可以是任何不含 ...