2024年3月9日发(作者:)
娶; 霎
CGI在Lighttpd Web服务器上的应用与实现
胡志慧
(湖北汽车工业学院电气与信息工程学院湖北十堰442002)
0
【摘要】:在嵌入式系统下选用Lighttpd搭建Web服务器,采用通用网关接口CGI技术实现客户
端和服务器之间的动态数据交互,这样大大简化了对嵌入式设备的管理和维护工作。
【关键词】:嵌入式系统;Li ttpd;通用网关接口
随着计算机网络技术和嵌入式技术的不断发展,
HTML格式回送到客户端浏览器。其中,HTrP请求是
将嵌入式系统与Web服务器两者结合起来,让嵌入式 由浏览器向Web服务器发出的一个要求获取服务的
Web服务器的应用越来越广泛。通用网关接口CGI是
请求。如果HTYP请求的URL fUniform Res0urce L0一
一
个信息服务器主机对外信息服务的标准接口,它是
cator)t ̄向的是一个可执行程序,服务器就立即运行此
服务器和前台HTML文件之间的接口程序,负责处理 CGI程序,CGI程序运行完后返回给服务器结果信息。
HTML文件与运行在服务器中的程序(HTML以外的
HTFP协议定义的请求方法中常用的主要有GET和
程序)之问的数据交换。软件设计人员可以开发CGI
POST,客户端FORM表的METHOD属性用来设置请
程序,根据用户在浏览器客户端的设置对指定的设备
求方法,其缺省值为GET。
进行操作,既提供了一个友好的人机界面,又为嵌入
式设备实现网络化实时监控、配置、维护等提供了高
效便捷的实施方案。
 ̄IETttOI) G
.
一
;Query String -
i
一
j、/
{。¨々鬻 据j. 裂 _._.-一 t
.
、
1 CGl概述
D=POST
MET HO
CGI fCommon Gateway Interface),即通用网关接
将结粜输H{
SI_DOI
口,是WEB服务器与外部扩展应用程序交互的一种
标准接口。CGI程序与Web服务器之间的数据通信主
要包括环境变量、命令行参数、标准输入STDIN和标
准输出STDOUT四个方面。
CGI是在Web服务器上定义了web客户请求与
图1 CGI工作原理流程图
2 CGI在嵌入式Lighttpd服务器中的应用
2.1 Lighttpd简介
在嵌入式Linux系统下,可选用Lighttpd搭建
应答的一种方法。服务器是客户端与扩展程序之间的 Web服务器。Lighttpd是一个性能非常优异的轻量级
通道。当客户端的用户完成了一定输入工作(比如填充 开源Web服务器,采用事件驱动和异步10技术,是一
完HTML文档中的FORM表1之后向服务器发出 个具有非常低的内存开销,CPU占用率低,效能好,以
ghttpd是众多开源轻量级的
H1TrP请求f称为CGI请求)。服务器守护进程接收到该
及丰富的模块等特点。Li
请求后,就创建一个子进程(称为CGI进程1,该CGI子 Web Server中较为优秀的一个,支持FastCGl,CGI,
进程将CGI请求的有关数据设置成环境变量。在外部 Auth,输出压缩,URL重写,Alias等重要功能。
CGI程序与服务器间建立两条数据通道标准I/O,然
2.2 Lighttpd构建过程
后启动URL指定的CGI程序,并与该子进程保持同
如下图1所示。
由于Lighttpd是源代码开放的,因此可以从它的
代码。首先解压源代码,然后交叉编译并安装。接着配
http://lighttpd.net/download/)下载到最新的源
步,以检测CGI程序的执行状态。CGI工作原理流程
官网上(
子进程通过标准输出流将处理结果传递给服务 置Lighttpd Web服务器,包括指定服务器的根目录、
器守护进程,守护进程再将处理结果作为应答消息以
日志文件名、服务器端口等基本配置,也需配置需要
基金项目:湖北汽车工业学院校青年科研基金,项目编号:2o12XQOl
・
28・ 福建电脑I 2ol3年第7期
。一 一一 ~ 一 …一一…一一… ~ 一 .…~…… 一 一…一
曼汀嚣一一
Content-Type:application/octet—-stream
加载的模块,对CGI进行配置,服务器优化配置。最后
制作启动脚本,让系统启动时能自动启动Lighttpd。
8186581731529738798l 13985396
Content—Disposition:form—data;name=’’button”
abcdefg
~………
2.3 Lighttpd中CGI执行流程
首先浏览器客户端向Lighttpd发出服务请求,对
于客户端的每一个请求(动态页面,也就是需要CGI
处理的),Lighttpd将产生to_cgi fds(发送通道)和
from cgi
fds(接收通道)两个管道,Lighttpd与CGI程
_
818658173l5297387981 13985396
以上的格式是CGI获取的完整数据,第一行的长
串数字是特征码,每次CGI获取的特征码都会不同。
ent—Type是指客户端用
序之间就是通过这两个PIPE管道进行通信的。接着
上传的文件名是“1”,Cont
fork一个CGI进程,然后利用execve0 ̄U建并加入必
POST方法发送文件,文件的数据类型是二进制的文
要的环境变量,这包括客户端请求信息中的请求头,
通过转换成相应的环境变量形式传递给CGI程序。同
时通过发送通道将客户端请求信息中的请求体发送
给CGI,然后使用elose(to_cgi_fds[1])关闭发送通道。
Lighttpd需要从接收通道获取CGI的处理结果,因此
对描述符from—egi_fds[0]上的可读事件进行监控,事
件的处理函数为cgi_handle fdeven0。最后,Lighttpd再
将CGI处理的返回结果发送给客户端,完成此次对客
户端请求的服务器响应。Lighttpd中CGI的执行流程
如图2所示,其中的小黑点表示CGI进程被停止。
r ] 服务请
求 Lighttpd j
f
一…一
【PLipe(to cg fds) I
服务
图2 Lighttpd中CGI执行流程
2.4 CGI进行文件上传的实现
文件上传的原理是客户端使用表单提交文件数
据,服务器端CGI程序按照特定格式解析数据,获得
文件内容后进行保存或其他处理。
(1)CGI获取内容分析
此处的特定格式如下所示:
…~~…
818658173l5297387981 13985396
Content—Dispositi0n:form-data;name=”fileField”;
iflename=”】”
件,第二个特征码下面的一行信息后,就是要获取的
文件的内容了,此处文件内容为“abedefg”获取完内容
后,最后还会有一行特征码,也就是后面介绍的check
和end状态里需要的判断条件。
(21 HTML页面代码分析
此处由于上传文件较大,选用的是POST方法,此
时FORM的数据最后放在QUERY_STRING中,传递
给CGI程序,通过检查环境变量CON—
TENT
_
LENGTH,可以知道有多少字节输入;发送文
件、二进制数据和非ASCII码数据应使用的内容类型
是muhiparffform—data。用ACTION调用CGI可执行程
序如下所示:
<FORM METHOD=”POST”id=”form”name=”form”
ENCTYPE=”muhipart/form-data”ACTION=”cgi-bin/upload.
cgi”>
选择文件:<INPUT TYPE=”FILE”NAME=”FILE”id:”
FILE”
class=”btn”><INPUT TYPE=”button”onclick=”upload file
0”
VALUE=”上传”class=”btn”><br)
(31 CGI程序分析
此上传的CGI程序主要是用状态机实现的。共划
分为7个状态,这些状态是按照收到的文件的特定格
式来确定如何划分的,状态流程图如图3所示:
/…~、
、 /一~\
一一~
一
~
STAR (a) IG 【b)
一
GEl I1 E NAME
、
、
~一/ 、
/ ~
~一一
(c) 一一~
一一一 …~
㈨
,
、
G FjL STAR7
一
0㈨
、、T一
一
,
--一一一
( ) / ‘ ’
一一
t
,
一
、,
)
』
.
、
GEl 1FILE CONTENT 7 , GIECK)
、
~
一
\
~
、
,
、一,
gj
图3 CGI状态流程图
(a)GET_START无条件转向GET_SIGN。
(b)当指针readP的值为“ n”时。
(C)当指针readP的值为“filename=”时。
(下转第43页)
2013年第7期J福建电脑 ・29・
………
A
|UJ
I
record.Put(”性别”,”男”);
储到当前指针所指记录处的字段性别下
record.m
_
擐
亍
{
中项删除
record.m_pRs一>Delete(adAffectCurrent);//将数
m_list.DeleteItem(k); ,/将列表中的被选 /,将数据男存
,更新数据库
pRs->Update0;
,
}
据库中被选中项删除
record.m
_
record.SetDB(”性别”,”男”);//也可以用record.SetDB
(”性别”,”男”,”姓名”,”王涛”);
】】
pRs一>Update0; //更新数据库
if(record.GetTotal0 1=o1
fint k=0;
esle{MessageBox(”请选择要删除的项!”,”提示”,MB—OK);}
}
while(!record.m_pRs->adoEOF)
fk=m_list.InsertItem(0xfff,record.Get(”姓名”));m_list.
SethemText(k,1,record.Get(”性别”));
record.m
_
4结语
根据需要可以增加更多、分工更细的函数,通过
pRs一>MoveNextO;l
封装技术,将使ADO访问数据库更加灵活和高效。
参考文献:
[1]蒋华伟,郑维智,李战升.VC访问数据库的技术[J].北京工
商大学学拥 ,2003,21(2):26-29.
[2]高武奇,康凤举,钟联炯.基于Web服务的OPENT功能封
装模型[J].火力与指挥控制,2011,36(9):122-124
}
else{MessageBox C没有符合要求的记录!”,”提示”,
MB
_
OK);}
J
void CTestDlg::OnShanchuO
f int k=m_list.GetSelectionMark0;//获得当前被选中
的行数
if(k!=-1)
{ CString name=re_list.GetItemText(k,o);//得到一
个姓名的值
[3]林瑞仲,吴越.Visual c++.NET库类应用实例[M].北京:电
子工业出版社,2003.
[4]范辉.Visual c++6.0程序设计简明教程[M].北京:高等教
CString sex=m list.GetItemText(k,1); ,,得到一
育出版社,2001.
1 5 J Liang Dan—xi,Liu Gang,Li En—man,et a1.Database—based
web page lJ J.Wuhan University Journal of Naturla Sciences,
个性别的值
record.SetDB(”姓名”,name,"'陛别”,sex);,/索取
所有符合条件的记录
if(record.GetTotal0 1=01
记录数为零
//判断索取的
2012,6(1—2):443—447.
写 写 写 写 石 峪
(上接第29页)
(d)当指针readP的值为“
特征码相同时。
度小于特征码的长度时。
”时。
描述了在Lighttpd服务器通过采用CGI技术实现上
e)当指针readP的值为“kr’,&&readP+2的值与
传功能。由于嵌入式系统中Web服务功能的提供,与
CGI技术的相结合,使得嵌入式设备的控制操作有了
(f)当指针readP的值为“\r’,&&当前段剩余的长
更多的选择。
(g)当不满足第8个条件时。
2的值与特征码相同时。
3结束语
参考文献:
[2]李勇CGI在嵌入式WEB服务器中的应用和实现[J].微计
J]_计算机应用研究1999,(3)
(h)当变量writeP的长度的值为“ ’,&&writeP+
[1]黄怀亮CGI技术及其应用[
算机信息2008,(24)
[3]张曦煌,柴志雷嵌入式Web服务器中CGI的特点及实现
[J¨、型微型计算机系统2003,(11)
本文对CGI的基本工作原理、Lighttpd的构建过
程和Lighttpd中CGI的执行流程等进行了介绍,最后
2013年第7期I福建电脑 ・43・


发布评论