在google HK上搜索"Apache" "Core" "深入" "core.c"有680条记录。进入英文世界,以包含"Apache" "Core" "core c" "apr.h"的关键词组搜索共有550个搜索记录。
看完部分G摘要后,打开core.c及对应头文件开始架构的深潜运动……
首先在进入httpd为核心的HTTP应用层之前,我们先了解连接SOCKET5与HTTP的中间部分:
#include "apr_general.h"
#include "apr_tables.h" //基础储存结构
#include "apr_pools.h"
#include "apr_time.h"
#include "apr_network_io.h"
#include "apr_buckets.h"
这可以看成是Apache HTTP应用的基础*
这里面封装SOCKET5的函数,不过通过操作系统的API实现:即上次说过的os.h中的内容*。
可以说,这个是核心的核心——APR
APR包含了连接、登录、线程、用户管理、时间管理、文件管理及内存管理(储存、数据类型及结构)等相当多的内容。
此核心的核心约10万行代码(含测试约2万行代码)。*(以后如未说明,代码行数均以httpd-2.0.64 UNIX为例)
1.1 连接
核心为SOCKET5的应用,这里使用操作系统的API。
UNIX版中也有WIN32的应用,分别在名为apr_network_io.h等头文件以及sendrecv.c,sockets.c,sockopt.c三个实现中。
主要内容可参见一些SOCKET编程的资料。
里面包括了发送、接收、连接时间控制、端口管理及系统级IP过滤(apr_socket_accept_filter)等。
1.2 登录控制
此版本的登录控制比较容易,主要通过文件操作来比对完成。
1.3 线程
主要通过apr_thread_proc.h定义的函数/方法产生如建立线程、
1.4 用户管理
实现在用户名与ID的管理,用户可归入用户组,这个管理有点像手机的电话薄。
详见apr_user.h
1.5 时间管理apr_time.h
1.6 文件管理
完成对文件的操作及管理,类操作系统的功能。详见apr_file_info.h、apr_file_io.h
1.7 内存管理(储存、数据类型及结构)
1.7.1 基本数据类型
不知道是为了证明水平,还是要证明自有的特有的变量特征,还是显示个性,看过的架构的基础数据类型均有自己的别名。大家似乎乐此不疲。
这也不过分,这样的逻辑结构及应用更统一,我们自己设计架构时也经常会这么做。这里还有一个好处是代理,从32位变为64位只要改一下头文件就可以了。说到这里也就知道这是一个良好的习惯了。
不过要看懂,要还原为标准C及STL的结构特征(如果有对应结构)
(1)整型
apr_signum_t
无符号整型
apr_uint32_t s_addr
(2)常量(包括常量字符)
APR_ANYADDR
SOCKET参数 共4字节的特征码,最大16384,二进制表示最高位为0100*
协议代码:TCP、UDP等;
(3)结构
最主要的结构是应用在SOCKET5中的地址结构。
1.8 *事件及代理机制
APR中已经包含了对事件及函数代理的使用,代码简洁。