• 跨平台网络通信与server编程框架库(acl库)介绍


    一、描写叙述

    acl project是一个跨平台(支持LINUX,WIN32,Solaris,MacOS,FreeBSD)的网络通信库及server编程框架,同一时候提供很多其它的有用功能库。通过该库,用户能够很easy地编写支持多种模式(多线程、多进程、非堵塞、触发器、UDP方式)的server程序,WEB 应用程序,数据库应用程序。此外,该库还提供了常见应用的client通信库(如:HTTP、SMTP、ICMP、memcache、beanstalk),常见流式编解码库:XML/JSON/MIME/BASE64/UUCODE/QPCODE/RFC2047 etc。

    1.1、库组成

    本project主要包括 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 下的 ,同一时候兼容 UNIX 下的 的结束符
    • 2 按行读数据但要求自己主动去掉尾部的 或
    • 3 以字符串为分隔符读取数据
    • 4 读规定长度的数据
    • 5 尝试性读一行数据或尝试性读规定长度数据
    • 6 探測网络 IO 状态
    • 7 写入一行数据
    • 8 按格式符写入数据,类似于 fprintf
    • 9 文件流定位操作,类似于 fseek
    • 10 一次性写入一组数据,类似于 unix 下的 writev
    • 11 将文件截短,类似于 ftrunk
    • 12 获取文件大小
    • 13 获得当前文件流指针位置,类似于 ftell
    • 14 获得文件尺寸
    • 15 获得网络流的本地地址及远程地址

    • 网络操作模块:该模块主要支持网络服务端监听(支持 TCP/UDP/UNIX 域套接口)、网络client连接(支持 TCP/UNIX 域套接口)、DNS 域名查询及结果缓存(支持调用系统 gethostbyname 函数和直接发送 DNS 协议两种方式)、套接口(socket)操作及取本机网卡等功能。

    • 非堵塞网络流:支持非堵塞方式连接、读(按行读,规定长度读)、写(写行,写规定长度,写一组数据)等操作。

    • 常见网络应用协议库(lib_protocol/lib_acl_cpp):主要支持常见网络应用协议,诸如:HTTP、SMTP、ICMP,当中 HTTP、ICMP 两个模块实现了堵塞、非堵塞两种通信方式;此外,HTTP 协议在C++版的 lib_acl_cpp 中还支持服务端、client两种通信方式,当作为服务端使用时,支持类似于 JAVA HttpServlet 的接口使用方式,当作为client方式使用时,支持连接池与集群管理方式,该模块同一时候支持 cookie、session、HTTP MIME 文件上传、分块传输、字符集自己主动转换、自己主动解压缩、断点续传等丰富的功能。

    • 常见网络通信库:支持 memcached、beanstalk、handler socket client通信库,该通信库支持连接池方式。

    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、网络server框架

    该模块是 acl 中最为重要的模块,提供了server编程中经常使用的基础设施,该server框架来源于著名的 Postfix,在其基础上进行了诸多扩展,眼下已经支持的主要服务模型有:

    • 1 多进程模型:一个连接一个进程,这样的模型的长处是编程简单、安全稳定,缺点是并发度不高;
    • 2 多进程多线程模型:每一个子进程是由线程池中的一组线程处理全部的client连接,採用 IO 事件触发方式,仅仅有当连接有数据可读时才会将连接与一个线程进行绑定,线程处理完后马上归还给线程池,这样的模型的最大长处是能够用少量的线程便能够处理大量的client连接,并且编程比較简单(相对于非堵塞模型);
    • 3 多进程非堵塞模型:每一个子进程是由一个单独的非堵塞线程组成,该线程採用全然非堵塞 IO 方式处理外来的大量client连接(类似于 nginx/squid/ircd),该模型的长处是处理效率高占用资源少,能够处理大量client连接,缺点是编程比較复杂;
    • 4 UDP 通信模型:该模型主要为了支持 UDP 网络过程而添加的服务模型;
    • 5 解发器模型:该模型的实例主要用来处理一些定时任务的后台服务过程(类似于系统的 crontab)。

    server框架中的子进程有用採用半驻留服务模型,支持子进程预启动机制、最大最小进程数控制、子进程异常报警、单一进程监听多个地址(可同一时候监听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 server框架中多进程多线程服务模型中)。

    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、文件队列处理库

    支持多组文件夹队列文件的创建、扫描、删除等操作;经常使用于暂时文件队列调度的服务程序中。

    二、平台支持及编译

    整个project眼下支持 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 的动态库时,须要在用户的project提前定义: ACL_DLL;
    • 使用 lib_protocol 动态库中的 HTTP 库或 ICMP 库时,须要在project中提前定义 HTTP_DLL 或 ICMP_DLL;
    • 使用 lib_acl_cpp 的动态库时,须要在project中提前定义 ACL_CPP_DLL,假设您使用用 VC2003 编译环境则还须要提前定义 VC2003;
    • 使用 lib_dict 的动态库时,须要在project中提前定义 DICT_DLL;
    • 使用 lib_tls 的动态库时,须要在project中提前定义 TLS_DLL。  

    三、项目资料

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

    sourceforge:http://sourceforge.net/projects/acl/

    相关技术博客:http://zsxxsz.iteye.com/

    QQ 群: 242722074

    acl project有大量的測试用例(近200个):https://github.com/zhengshuxin/acl/blob/master/SAMPLES.md

    此外,还几个有用的工具:

    1、server程序生成向导:https://github.com/zhengshuxin/acl/tree/master/app/wizard,使用该工具,能够高速地创建网络server程序(甚至于 HTTP WEB server程序)

    2、全局唯一ID产生器:https://github.com/zhengshuxin/acl/tree/master/app/gid

    3、网络状态监控工具(WIN32):https://github.com/zhengshuxin/acl/tree/master/app/net_tools

    4、TCP 连接分配器:https://github.com/zhengshuxin/acl/tree/master/app/master_dispatch

    5、字符集转换器:https://github.com/zhengshuxin/acl/tree/master/app/jencode

    四、图例

    1、类索引图:



    2、异步 IO 类继承图



    3、IO 流继承图



    4、接收上传文件的 CGI 程序:



    5、文件下载client程序:



    6、网页下载程序:




  • 相关阅读:
    查看.NET Core源代码通过Autofac实现依赖注入到Controller属性
    序列化二叉树
    把二叉树打印成多行
    按之字形顺序打印二叉树
    对称的二叉树
    JDK源码阅读顺序
    二叉树的下一个结点
    删除链表中重复的结点
    链表中环的入口结点
    字符流中第一个不重复的字符
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/3942354.html
Copyright © 2020-2023  润新知