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一 

, 

--一一一 

( ) / ‘ ’ 

一一

, 

一 

、,

) 

. 

、 

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

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・