1、Nucleus Webserv分析及归纳
子文件夹:Inc、SRC
(1)分析文件
####### Inc ######:
nu_websr.h WebServ模块所有需要的头文件。
包含了所有Webserv下的ws_cfg.h、ws_defs.h、ws_extr.h和Nucleus OS基础的头文件;
ps_pico.h 仅提供向后兼容,仅为插件提供支持。
没有包含任何头文件,只包含了nu_websr.h,和HTTP相关的宏定义和结构体;
这个文件中的各种定义比较多,就不多说了。
wpw_auth.h 该文件包含链表定义,用于操纵多个链表上的认证结构体。
没有包含任何头文件,和 定义了认证相关的链表、结构体、相关函数声明。
定义的宏,都是一个格式:
#define WPW_XXXXXX_XXXXXXX
定义的结构体,都是一个格式:
typedef struct _WPW_XXXX{
}WPW_XXXX;
或者
typedef struct{
}WPW_XXXX;
或者
struct WPW_XXXX{
};
声明的函数,都是如下:
void BSC_XXXXXXXXX( void);
void ENC_XXXXXXXXX( void);
void DES_XXXXXXXXX( void);
ws_cfg.h 这个文件包含了许多控制宏,以便于控制是否支持Nucleus WebServ的扩展功能。
没有包含任何头文件,和 仅仅只定义了相关功能的宏。
定义的宏,都是一个格式:
#define WS_XXXXXX_XXXXXXX
ws_defs.h WebServ的数据结构。
没有包含任何头文件,只有宏定义和WebServ相关结构体的定义。
定义的宏,都是一个格式:
#define WS_XXXXXX_XXXXXXX
定义的结构体,都是一个格式:
typedef struct _WS_XXXX{
}WS_XXXX;
或者
typedef struct{
}WS_XXXX;
ws_extr.h 包含了WebServ正常工作所必须的函数声明。
没有包含任何头文件,但是,指出了每个".c"中,声明了的函数,并且每个".c"中的声明函数的头是相同的。
例如:
/* CFS_TOOL.C */
void CFS_XXXXXXXXX( void);
/* HTTP_PSR.C */
void HTTP_XXXXXXXXX( void);
/* WS_TASKS.C */
void WS_XXXXXXXXX( void);
/* DIR_PLGN.C */
void DIR_XXXXXXXXX( void);
/* UPL_PLGN.C */
void UPL_XXXXXXXXX( void);
####### SRC ######
wpw_list.c
这个文件包含了WebServ在HTTP 1.1/1.0 认证时,用户ID的密码结构体。Webserv Password List。
只包含了两个头文件nu_websr.h、wpw_auth.h 和 一个结构体(数组作为表格,用户ID和密码一一对应)。
upl_plgn.c
上传插件。
只包含了一个头文件nu_websr.h。并且,将除了这个include “nu_websr.h”之外的代码,使用
#ifdef WS_FILE_UPLOAD_PLGN
#endif
包括了,说明是否加入代码是由ws_cfg.h衷的宏控制的。
分析知:
文件内部的函数,每一个小部分都是定义如下:
static void UPL_XXXXXXXXX( void){ ...}
只有外部文件可以使用的函数,没有加static前缀:
void UPL_XXXXXXXXX( void){ ...}
mim_list.c
这个文件包含了发送给浏览器的mime类型的结构体。
只包含了一个头文件nu_websr.h 和 一个结构体(数组作为表格,文件类型和HTML类型一一对应)。
http_psr.c
HTTP解析器。
这个文件是WebServ的核心处理代码。除了认证和加密功能,其余功能都是支持的。
只包含了两个头文件nu_websr.h、wpw_auth.h。
同时,本文件内使用的函数声明格式如下:
static void HTTP_XXXXXXXXX( void);
本文件内使用的全局变量声明格式如下:
static void *HTTP_XXXXXXXXX[] = {...};
外部文件可以使用的全局变量, 定义前不用加static:
WS_FS_FILE *HTTP_XXXXXXXXX;
注:Nucleus OS中的基础头文件nucleus.h对各种类型进行了重定义,要统一使用重定义后的各种类型。
dir_plgn.c
目录插件。
功能是用于获取文件系统的结构和将目录结构和文件数目发送给HTTP客户端。插件必须在server被使用前,注册。
只包含了一个头文件nu_websr.h。并且,将除了这个include “nu_websr.h”之外的代码,使用
#ifdef WS_LIST_DIR_PLGN
#endif
包括了,说明是否加入代码是由ws_cfg.h衷的宏控制的。
遵循文件内使用的函数前要加前缀static,而给文件外使用的函数不用加。
des_auth.c
DES认证。
此该文件将Java应用程序与实际加密过程链接起来。
包含了两个头文件nu_websr.h、netevent.h,如果定义了WS_AUTH_PLUGIN,则还包含wpw_auth.h。
使用
#ifdef WS_AUTH_PLUGIN
#endif
包括了,说明是否加入代码是由ws_cfg.h衷的宏控制的。
遵循文件内使用的函数前要加前缀static,而给文件外使用的函数不用加。
cfs_tool.c
压缩文件系统工具
这个文件中的函数功能,适用于加压或解压文件。
只包含了一个头文件nu_websr.h。并且,将除了这个include “nu_websr.h”之外的代码,使用
#ifdef WS_FILE_COMPRESSION
#endif
包括了,说明是否加入代码是由ws_cfg.h衷的宏控制的。
遵循文件内使用的函数前要加前缀static,而给文件外使用的函数不用加。
同时,本文件内使用的函数声明格式如下:
static void CGS_XXXXXXXXX( void);
本文件内使用的全局变量声明格式如下:
static void *CGS_XXXXXXXXX[] = {...};
外部文件可以使用的全局变量, 定义前不用加static:
WS_FS_FILE *CGS_XXXXXXXXX;
注:Nucleus OS中的基础头文件nucleus.h对各种类型进行了重定义,要统一使用重定义后的各种类型。
bsc_auth.c
基础认证
这个文件包含了几个例程,例程用于初始化和实现HTTP 1.1/1/0 基础认证算法。
也包含了两个用户插件,可以使用插件进行添加、删除、显示这个系统的用户。
要使用这个功能,必须在ws_cfg.h中定义WS_BASIC_AUTH。
包含了两个头文件nu_websr.h、netevent.h,如果定义了WS_BASIC_AUTH,则还包含wpw_auth.h。
使用
#ifdef WS_BASIC_AUTH
#endif
包括了,说明是否加入代码是由ws_cfg.h衷的宏控制的。
遵循文件内使用的函数前要加前缀static,而给文件外使用的函数不用加。
同时,本文件内使用的函数声明格式如下:
static void BSC_XXXXXXXXX( void);
本文件内使用的全局变量声明格式如下:
static void *BSC_XXXXXXXXX[] = {...};
外部文件可以使用的全局变量, 定义前不用加static:
WS_FS_FILE *BSC_XXXXXXXXX;
注:Nucleus OS中的基础头文件nucleus.h对各种类型进行了重定义,要统一使用重定义后的各种类型。
ws_tasks.c
WebServ 任务
这个文件包含了Nucleus Web Server tasks。它处理了任务初始化。这个任务的初始化处理,包括绑定
一个socket、监听这个socket、等待client连接、处理连接。也包含了对于web serv prodoct支持例程。
包含了两个头文件nu_websr.h、netevent.h。
遵循文件内使用的函数前要加前缀static,而给文件外使用的函数不用加。
(2)文件对比
ws_tasks.c、http_psr.c、mim_list.c、wpw_list.c都是核心文件,必须存在。
ws_cfg.h、ws_defs.h、ws_extr.h和Nucleus OS基础的头文件 都是核心文件,必须存在。
故:基础文件nu_websr.h在每一个".c"文件中,必须存在。
ws_cfg.h是配置文件,只有宏定义,没有其它的。
ws_defs.h是内部数据结构体、宏定义的集合。
ws_extr.h是提供给wersv模块以外函数使用的,只要在其中声明号函数就可以了。
(3)命名规则对比
函数名称:每一个函数开头都要大写,下划线后第一个字母都要大写。
结构体名称:结构体名称的每一个字母都要大写,之间可用下划线连接。
在其中我也发现了没有大写,全部是小写的结构体名称,但是我观察这些结构体都是在某一小功能内使用的。
宏定义名称:定义变量,则每一个字母都要大之间可用下划线连接;
定义函数别名,遵从函数名称定义规范即可。
变量声明:
对于int、char,不要直接使用。要使用 nucleus.h 中,系统重定义的规范。
全局变量名称: 每一个全局变量开头都要大写,下划线后第一个字母都要大写。
函数内局部变量名称: 一般小写加下划线分开即可。
模块内部:每一个文件,就是一个功能。功能的简写,就是宏、结构体、全局变量(文件内和文件外)、函数(文件内和文件外)的前几个字母。
给文件内部使用的函数,加static;文件外函数,不用加。
模块提供的外部接口:要统一的定义在一个头文件内。外部接口的头文件内的函数名可以不统一,但必须遵从一定的规范。
定义的宏,都是一个格式:
#define WPW_XXXXXX_XXXXXXX
定义的结构体,都是一个格式:
typedef struct _WPW_XXXX{
}WPW_XXXX;
或者
typedef struct{
}WPW_XXXX;
或者
struct WPW_XXXX{
};
文件内使用的函数声明格式如下:
static void HTTP_XXXXXXXXX( void);
文件外使用的函数声明格式如下:
void HTTP_XXXXXXXXX( void);
文件内使用的全局变量声明格式如下:
static void *HTTP_XXXXXXXXX[] = {...};
文件外使用的全局变量声明格式如下:
void *HTTP_XXXXXXXXX[] = {...};
文件外可以使用的全局变量, 定义前不用加static:
WS_FS_FILE *HTTP_XXXXXXXXX;
(4)WebServ引用
模块内:文件之间引用的全局变量,都是直接使用extern 完成的。
文件之间引用的函数,未见直接使用extern 完成的。从代码中,可看出其使用了ws_extrn.h。
ws_extrn.h中的函数,即被模块内文件自己之间相互使用,也被提供给其它模块使用。
模块外:模块提供给其它模块使用的函数包含在了ws_extrn.h中。
ws_extrn.h中的函数,即被模块内文件自己之间相互使用,也被提供给其它模块使用。
(5)总结
每一个文件,就是一个功能组件。文件内自己使用的函数,在文件内直接声明即可,而提供给外部使用的函数,就可以被称为组件接口。
组件接口定义一个统一的头文件内,这个头文件包含了很多个组件,有很多个不同的组件接口。
包含组件接口的头文件,就是提供给模块内和模块外函数使用的接口。但是我感觉这样不好,认为将提供给模块外函数使用的接口,另外
写到一个文件内比较好。