CGIC库的使用

随着 Internet 技术的兴起,在嵌入式设备的管理与交互中,基于 Web 方式的应用成为目前的主流,这种程序结构也就是大家非常熟悉的 B/S 结构,即在嵌入式设备上运行一个支持脚本或 CGI 功能的 Web 服务器,能够生成动态页面,在用户端只需要通过 Web 浏览器就可以对嵌入式设备进行管理和监控,非常方便实用。

嵌入式 WEB 服务器常见的有: boa lighttpd shttpd thttpd mathopd minihttpd appweb goahead

本系列的目的是演示如何使用C语言的CGI库“CGIC”完成Web开发的各种要求。

CGI

目前 Web 技术中生成动态 Web 页面的方法有 CGI 和服务器脚本,如 JSP, ASP 等,但后者需要 Web 服务器具有这些脚本的运行支持模块。在嵌入式 Web服务器中,考虑到资源限制问题,一般都只提供 CGI 支持,因此在嵌入式设备中 Web 方式应用实际上就是基于 CGI 的程序开发。

CGI(Common Gateway Intergace 通用网关界面)是一段运行在 Web 服务器上的程序,提供同客户端 Html 页面的接口。

我们举个实际例子:常见的个人主页上大都有一个留言本,留言本的工作方式是这样的:先由用户输入一些信息,如名字之类的东西,接着用户按一下“留言”(到目前为止工作都在客户端),浏览器就把这些信息传送到服务器的 CGI 程序中,于是 CGI 程序在服务器上按照预定的方法进行处理,在本例中就是把用户提交的信息存入指定的文件中,最后 CGI 程序给客户端发回一个“留言结束”字样的页面,用户可以在浏览器里看到。 在进行 CGI 编程之前,我们先了解 HTML 的一些知识。CGI 可以使用多种编程语言来实现,包括 C、 C++、Perl 等,但在嵌入式设备的开发中,一般都不会采用 Perl 等解释性语言,因为这种语言还需要有解释执行的支撑模块,会占用存贮空间和内存,最常用的方法当然是用 C 来编写,但 C 并不是很适合开发象CGI 这种需要大量进行字符串操作的程序,编程比较烦琐,因此,对于一个专业的开发人员来说,首先想到的应该是有没有可复用的库来支持快速高效的开发 CGI 程序。幸运的是目前就有不少开放源码的支持 CGI 开发的 C 库。

CGIC

CGIC 是一个支持 CGI 开发的开放源码的标准 C 库,可以免费使用,只需要在开发的站点和程序文档中有个公开声明即可,表明程序使用了 CGIC 库,用户也可以购买商业授权而无需公开声明。
CGIC 能够提供以下功能:
1 分析数据,并自动校正一些有缺陷的浏览器发来的数据;
2 透明接收用 GET 或 POST 方法发来的 From 数据;
3 能接受上传文件;
4 能够设置和接收 cookies;
5 用一致的方式处理 From 元素里的回车;
6 提供字符串,整数,浮点数,单选或多选功能来接收数据;
7 提供数字字段的边界检查;
8 能够将 CGI 环境变量转化成 C 中的非空字符串;
9 提供 CGI 程序的调试手段,能够回放 CGI 程序执行时的 CGI 状态;
总之,CGIC 是一个功能比较强大的支持 CGI 开发的标准 C 库,并支持 Linux, Unix 和 Windows 等多操作系统。

使用 CGIC 的基本思路: 从 cgic.c 的代码可以看出,它定义了 main 函数,而在 cgictest.c 中定义了一个 cgiMain 函数。也就是说,对于使用 CGIC 编写的 CGI 程序,都是从 cgic.c 中的代码进入,在库函数完成了一系列必要的操作(比如解析参数、获取系统环境变量)之后,它才会调用你的代码(从你定义的 cgiMain 进入)。

下载安装步骤:

wget http://www.boutell.com/cgic/cgic207.tar.gz
tar -zxvf cgic207.tar.gz

修改 cgic207 中 Makefile 文件:

install: libcgic.a   
cp libcgic.a /usr/local/lib  
cp cgic.h /usr/local/include  

改成:

install: libcgic.a  
cp libcgic.a /usr/local/src/lighttpd/lib  
cp cgic.h /usr/local/src/lighttpd/www/webpages/cgi-bin

注意 cp 等命令前以 tab 键开头,不要用空格键。

接下来两步要获取反转意函数功能:
打开 cgic.c,找到这一行语句:

static cgiUnescapeResultType cgiUnescapeChars(char **sp,   char *cp, int len);  

将 static 去掉,将声明添加到 cgic.h,加 extern:

extern cgiUnescapeResultType cgiUnescapeChars(char **sp,   char *cp, int len);

将结构体:

 typedef enum 
{  
    cgiUnescapeSuccess,  
    cgiUnescapeMemory 
} cgiUnescapeResultType; 

把这几行语句复制到 cgic.h 文件中,并在这里把它注释掉:

#if 0  
typedef enum
{  
    cgiUnescapeSuccess,  
    cgiUnescapeMemory  
} cgiUnescapeResultType;   
#endif  

添加编译器路径:

export PATH=$PATH:/opt/buildroot-gcc342/bin/  make  make install  

这样就生成库文件 libcgic.a。

把cgic.h, cgic.c, cgictest.c三个文件拷贝到同一目录,建立一个Makefile文件,其内容为:

test.cgi:你的程序.c cgic.h cgic.c  
  gcc -wall 你的程序.c cgic.c -o test.cgi    

需要提醒的是,第二行开头一定是一个tab键(且仅有一个),不能使用空格。

我们看到,当前目录下应该多了一个test.cgi文件。

你可能感兴趣的:(CGIC库的使用)