目前Web技术中生成动态Web页面的方法有CGI和服务器脚本,如JSP、ASP等,但后者需要Web服务器具有这些脚本的运行支持模块。在嵌入式Web服务器中,考虑到资源限制问题,一般都只提供CGI支持,因此在嵌入式设备中Web方式应用实际上就是基于CGI的程序开发。
CGI(Common GateIntergace)是一段运行在Web服务器上的程序,提供同客户端Html页面的接口。例如,常见的个人主页上大都有一个留言本,留言本的工作方式是先由用户输入一些信息,如名字之类的东西,接着用户按一下“留言”(到目前为止工作都在客户端),浏览器就把这些信息传送到服务器的CGI程序中,于是CGI程序在服务器上按照预定的方法进行处理,在本例中就是把用户提交的信息存入指定的文件中,最后CGI程序给客户端发回一个“留言结束”字样的页面,用户可以在浏览器里看到。
CGIC库的移植
在进行CGI编程之前,先了解HTML的一些知识。CGI可以使用多种编程语言来实现,包括C、C++、Perl等,但在嵌入式设备的开发中,一般都不会采用Perl等解释性语言,因为这种语言还需要有解释执行的支撑模块,会占用存贮空间和内存,最常用的方法当然是用C来编写,但C并不是很适合开发象CGI这种需要大量进行字符串操作的程序,编程比较烦琐,因此,对于一个专业的开发人员来说,首先想到的应该是有没有可复用的库来支持快速高效的开发CGI程序。幸运的是目前就有不少开放源码的支持CGI开发的C库。在此只介绍CGIC,有兴趣的读者可以自己在Internet上搜索其他的C库。
CGIC是一个支持CGI开发的开放源码的标准C库,可以免费使用,只需要在开发的站点和程序文档中有个公开声明即可,表明程序使用了CGIC库,用户也可以购买商业授权而无需公开声明。CGIC能够提供以下功能:
1.分析数据,并自动校正一些有缺陷的浏览器发来的数据;
2.透明接收用GET或POST方法发来的From数据;
3.能接受上传文件;
4.能够设置和接收cookies;
5.用一致的方式处理From元素里的回车;
6.提供字符串、整数、浮点数、单选或多选功能来接收数据;
7.提供数字字段的边界检查;
8.能够将CGI环境变量转化成C中的非空字符串;
9.提供CGI程序的调试手段,能够回放CGI程序执行时的CGI状态;
下载后,解压到“/opt/EmbedSky/””目录下,会生成目录cgic205:
#tar xvfz cgic205.tar.gz
配置编译条件,进入cgic205目录,修改Makefile文件。下面是修改后的文件内容:
CFLAGS=-g -Wall
CC=arm-linux-gcc//原来是CC = gcc
AR=arm-linux-ar//原来是AR = ar
RANLIB=arm-linux-ranlib//原来是RANLIB = ranlib
LIBS=-L./ -lcgic
all: libcgic.a cgictest.cgi capture
install: libcgic.a
cp libcgic.a /usr/local/lib
cp cgic.h /usr/local/include
@echo libcgic.a is in /usr/local/lib.cgic.h is in /usr/local/include.
libcgic.a: cgic.ocgic.h
rm -f libcgic.a
$(AR) rclibcgic.acgic.o
$(RANLIB) libcgic.a
#mingw32 and cygwin users: replace .cgi with .exe
cgictest.cgi: cgictest.olibcgic.a
$(CC) $(CFLAGS) cgictest.o -o cgictest.cgi ${LIBS}//由gcc改成了:$(CC) $(CFLAGS)
capture: capture.olibcgic.a
$(CC) $(CFLAGS) capture.o -o capture ${LIBS} //由gcc改成了:$(CC) $(CFLAGS)
clean:
rm -f *.o *.acgictest.cgi capture
修改后保存退出,下面编译并优化。
编译,会在目录下生成capture的可执行文件和测试用的cgictest.cgi文件:
#make
优化:
#arm-linux-strip capture //arm-linux-strip 去掉调试信息
会把 capture 由原来的100K 左右变成现在的29K左右。