ARM平台嵌入式WEB服务器设计与实现.docx
HUNANUNIVERSITYOFTECHNO1.OGY(2014届)本科毕业设计(论文)资料题目名称:学院(部工专业:学生姓名:班级:指导老师姓名:最终评定成果,ARM平台嵌入式WEB服务器的设计及实现计第机及通信学院通信103班伍柏林通信103学号:叶玮琼职称,一一湖南工业高校教务处湖南工业高校本科毕业论文(设计)诚信声明本人慎重声明:所呈交的毕业论文(设计),题目ARM平台嵌入式WEB服务器的设计及实现是本人在指导老师的指导卜.,进行探讨工作所取得的成果。对本文的探讨作出重要贡献的个人和集体,均已在文章以明确方式注明。除此之外,本论文(设计)不包含任何其他个人或集体己经发表或撰写过的作品成果。本人完全意识到本声明应担当的责任。作者签名:伍柏林日期:2014年4月23日论文主要介绍了基于ARM9的嵌入式WCb服务器BOa的软、硬件设计及我实现,其中硬件部分的核心是:星的S3C2440为处理器.最终成果形式为可以远程访问的WebSerVer嵌入式服务器。Boa是一款单任务的HTlP眠务器。及其他传统的Web服务器不同的是当有连接恳求到来时,它并不为每个连接堆独创建进程,也不通过豆制自身进程来处理多链接,而是通过建立HTTP恳求列表来处理多路HTTP连接恳求。同时它只为CGI程序创建新的进程,这样就在最大程度上节约J'系统资源,这对嵌入式系统来说至关重要。同时它还具有自动生成书目、自动解压文件等功能。因此,Boa在战入式系统中具有很高的应用价值.关键词:ARM;1.inUx;嵌入式WCb服务器:CGlAbstractTinspaperhasmainlydevelopedthesoftwarehardwaredesignandrealizationoftheembeddedWebserverBoabasedonARM.AndthecoreofthehardwarePartisS3C2440microprocessorproducedbySamsung°Thefinalachievementistheembeddedwebserverwhichcanremotevisit.Boaisasingle-taskingHTTPserver.That11wansthatunliketraditionalwebservers,itdocsnolforkforeachincomingconnection*nordoesitforkmanycopiesoitselftohandlemultipleconnections.ItinternallymultiplexesalloftheongoingHTPconnections.AndforksonlyforCGIprograms,thisisveryimportanttoembeddedsystem.Atthesametime,italsohasthefunctionofautomaticdirectorygeneralionautomaticandsoon.SoBoaisofhighlyvaluein(heembeddedsystemapplication.Keywords:ARM:1.inux:EmbeddedWebserver:CGI第一章引言随若汁兑机技术的发展,嵌入式系统已成为汁算机领域的一格电要组成部分。以ARM体系结构设计的微处理器具有高性能、低功耗和低成本的特点,它广泛应用于收人式系统设计领域,是目前最广泛的32位微处理器。以前设备限制系统股是通过通信线路进行的,其通信介质、通信协议、相关软件和硬件都是专用的,而InternCt技术的发展使嵌入式设备的远程限制和管理方式有了变更。不须要专用的通信线路,并且传输的信息不局限丁数据信号,还有声音和图像.最终要的是其通信协议是标准且公开的.随着Web技术的发展,几乎变更了现在的信息表达形式,很多应用都是基于Web技术的.由于HTM1.语言的标准统一性,只要在嵌入式设备中有一个御(型服务器,就可以运用随意一种Web阅读器接收和发送信息.所以如何设计这种特殊的WCb服务器,如何在嵌入式设备中安装WCb服务器,就成了嵌入式Web服务器的发展和探讨方向.对于嵌入式Web服务器的探讨和应用,其意义是重大的,它为我们管理、限制和监测各种各样的设备供应了一个很好的途径.这种设备可以是具有有限内存资源的8位或16位系统,已足的供应一个用户界面,而且这种方式是基于InlCmeI的。这种设备可以在世界任何一个地方,只要它连入Intemet就能够限制它.其次章课题背景这章对嵌入式系统作了定义,具体介绍了嵌入式1.inUX以及嵌入式1.inUX在现代嵌入式系统中的地位,殷终介绍了本次课题的硬件平台。嵌入式系统被定义为:以应用为中心、以计舞机技术为基础、软件硬件可裁剪、适应应用系统对功能、牢器性、成本、体枳、功耗严格要求的专用计算机系统,在制造工业、过程限制、通讯、仪器、仪表、汽车、船舶、航空、航天、军事装备、消费类产品等方面均是嵌入式计算机的应用领域.嵌入式系统是将先进的计算机技术、半导体技术和电子技术和各个行业的具体应用相结合后的产物,这一点就确定r它必定是一个技术密臾、资金密集、高度分散、不断创新的学问集成系统。2«2嵌入式系统和1.inuxI®若微处理器的产生,价格低廉、结构小巧的CPU和外设连接供应了秘定牢苑的硬件架构,那么限制嵌入式系统发展的瓶颈就突出表现在了软件方面。尽管从八十年头末起先.接连出现了一些嵌入式操作系统,比较同名的有Vxwork、pS0S,NUClwS和WindOWSCE.但这些专用操作系统都是商业化产品,其昂扬的价格使很多生产低湍产品的小公司望而却步:而I1.源代码封闭性也大大限制了开发者的主动性.另外结合国内实情,当前国家对自主操作系统的大力支持,也为源码开放的1.inUX的推广供应的广袤的发展前景。还有,对上层应用开发者而言,嵌入式系统须要的是一套高度简练、界面友善、质量牢靠、应用广泛、易开发、多任务,并且价格低廉的操作系统.在不久的将来,从冰箱到收音机都会内置处理器“因为1.inUX的开放性,很多人认为1.inUX特别适合多数Intemet设备.他们认为1.inUX可以支持不同的班备.支持不同的配置.1.inux对厂商不偏不倚而且成本极低.能够很快成为用于各种设省的操作系统。如今,业界已经达成共识:即嵌入式1.inUX是大势所趋,其巨大的市场潜力及酝酿的无限商机必定会吸引众多的厂商进入这一领域.1.inUX为嵌入操作系统供应了个极有吸引力的选择,它是个和UniX相像、以核心为基础的、完全内存爱护、多任务多进程的操作系统。支持广泛的计算机硬件,包括X86,Alpha,Sparc.MPS,PPC.ARM.NEC,MOTORO1.A等现有的大部分芯片。程式源码全部公开,任何人可以修改并在GNU通用公共许可证(GNUGeneralPublic1.iCenSe)下发行,这样,开发人员可以对操作系统进行定制,再也不必担忧像MSWindOwS操作系统中“后门"的威逼.同时由于有GP1.的限制,大家开发的东西大都相互兼容,不会走向分裂之路.1.inux用户遇到问物时可以通过IntCme响网上成千上万的1.inUX开发者请教,这使最困难的问题也有方法解决。1.inUX带有UniX用户熟识的完善的开发工具,几乎全部的UniX系统的应用软件都已移植到了1.inUX上。1.inUN还供应了强大的网络功能.仃多种可选择窗口管理器(Xwindows).其强大的语言编译器gcc、g+等也可以很简洁得到。不但成熟完善、而且运用便利17.选择1.inUX的缘由:1.可应用于多种硬件平台。1.inUX已经被移植到多种硬件平台,这对受开销、时间限制的探讨及开发项目是很有吸引力的。原型可以在标准平台上开发然后移植到具体的硬件上,加快了软件及硬件的开发过程.2。1.inUX可以随意地配置不须要任何的许可证或商家的合作关系。3.它是免费的,源代码可以得到.这是最吸引人的。亳无疑问,这会节约大量的开发帮用。4。它本身内贸.网络支持。5. 1.inux的高度模块化使添加部件特别简洁。S1.inux在台式机上的胜利,使大家看到了1.inUX在嵌入式系统中的辉煌前景。2。3.1ARM简介广义地讲,凡是带有微处理器的专用软硬件系统都可以称为嵌入式系统。它是嵌入到对象体系中的专用计兑机系统,以应用为中心,以计算机技术为堰础,软硬件可裁剪,适应应用系统对功能、牢靠性、成本、体积、功耗等严格要求的专用计奥机系统“ARM作为嵌入式系统得核心,既可以认为是个公司的名字,也可以认为是对一类微处理器的通称,还可以认为是种技术的名字,目前特别流行的ARM内核有ARMTrDMI、StrongARM.ARM72OT,ARM9TDMI、ARM920T,ARM940T,ARM946T,ARM966T、ARMlOTDMl等。本文所探讨的目标板的CPU为ARM920T内核的三星S3C2410芯片.下面介绍该微处理器的特点及其应用领域。ARM9系列微处理器在高性能和低功耗特性方面供应很佳的性能.它具仃以下特点: 供应1.lMIPSjMHZ的5级流水线结构; 支持32位ARM指令集和16位ThUmb指令集; 支持32位高速AMBA总线接口: 全性能MMU.支持WindoWSCE、1.inUx、PaInIoS等主流嵌入式操作系统: MPU支持实时操作系统: 支持数据CMhC和指令CaChC,具有更高的指令和数据处理实力。ARM9系列微处理器主要应用于无线设备、仪器仪表、平安系统、机顶盒、高湍打印机、数字照相机和数字摄像机等。它包含ARM92("、ARM922T和ARM940T三种类型,以适用于不同的应用场合.S3C24IOX是一款由SamSung公司设汁的低功耗、高集成度的基于ARM920T核的微处理器.这款芯片集成了以下部件:16KB指令CaChe、16KB数据CaChe、MMU、外部存储限制器、1.CD限制器(STN和TFT)、NANDFlaSh限制器、4个DMA通道、3个URT通道、一个12C总线限制器、一个12S总线限制港.以及4个PWN和1个内部定时器、通用I/O口、实时时钟、8通道IO位ADe和触摸屏接口、USB主、USB从、SD/MMC卡接口等.现在它广泛应用于PDA、移动通信、路由器、工业限制等领域以。2.3。 2nini2440嵌入式开发板Mini2440是一套硬软件集成的、基丁ARM的完整开发板,该系统包含丰畜的硬件资源、完善而优越的调试手段和详尽的资料1儿Mini2440目标处理器采纳SamSUng公司的S3C2440微处理器,是友善之臂公司出品的一款商业性质的开发板,嵌入式开发的全部过程都可在该环境下完成。系统有以下组成部分: ADTIDE集成开发环境: 各种连接线、电源适配潜以及学习光盘等; 教学试验系统配套光盘.Mini2440开发板模型如图1所示:cSCMc*jk三*三mxGPI<器口I(TT1.)AT24C081.SBHos:双声通音舞输出事口WrTU东口O(RS232)RJ45网络废ORNANDSiltAd入可调电即用户IEQRTC务份电池友H引出线-USBSlavo-*MJTAG0*a用户技16柒归入h3AN川M*开关图1.开发板模型示意图第三章建立嵌入式系统开发环境本章具体介绍了嵌入式系统开发环境的建立,1.inUX内核的编译,目标板中Uboot的烧写等。21在VmWare下安装UbUnuI12。04安装过程很简洁,在网关配置中我选的是桥接,安装完后如图所示1)安装VmWarCTools.进入系统后,点击虚拟机上的安装VmWaretools.TOohitMMR4VM*afI,I太y火CX。下一文件神:祈设«90"*IMM一软盘03昌SVMWf.VMeQfClOCiS«.».29021ZUff打开终端(应用程序-附件一终端)。在吩咐行输入“1s”后将列出文件夹文件:接岩输入"cdYmwarc-tools-distrib”指定到此文件夹,接着输入“1s”列出此文件夹内容,接着输入“sudo.vmare-instalUp,输入用户密码便可起先安装了。安装完成后重启,安装VmU)Ol可以实现虚拟机和物理机之间的文件共享。2.2虚拟机的配置1.1.1 2.1安装配置Iftp服务器I、安装相关软件包apt-gctinstalltftpd(服务端)aptgetinstalltltp(客户端)aptgetinstallxinetd2、建立配宜文件Cdctcxincld.dviIftp输入scn,icetftp(socke-ye=(lgramprotocol=udwait=yesuser=rootserver=usrsbinin<>tftpdSerVeJargS-s/tdisable=noPCJsOUrVC=11cps=1(X)2flags三IPv4J存盘退出3、建立tftp服务文件书目mkdir/t4、重新启动服务etcinitod/xinetdrestart安装完成!测试方法:在/1书目下随意放个文件abc然后运行I进入Mtp吩咐行输入getabc看看是不是能把文件卜卜来,假如可以就可以了,也可以PUt文件上去。检查IPIP是否打开:ChkConfiglist假如没有打开,则用这个吩咐也可以打开:ChkConfigt或者用PSAIgreptflp看是否有tftpd的服务1.1.2 配置NFS服务器1.NFS安装Ssudoat-uetinstallnfs-kernelservernfscommonportmapZNFS配苴2<.I配S7ecexor”文件$sudovimctccxports在文件最终加入如下内容:/rootnfs*(rw.sync.no_root_squash)注:Ms允许挂数的书目及权限在文件etcexports中进行了定义。其中:roomfs是要共享的书目.*代表允许全部的网络段访问,rw是可读写权限,sync是资料同步写入内存和硬盘,nojoo1.*quash是Ms客户端共享书目运用者的权限.假如客户端运用的是11x>t用户,那么对于该共享书目而.该客户端就具有me权限。1.1.3 交叉编译器的配置1、解压缩拷贝光盘书目的arnrlinux-gcc-4.3。2tgz,然后解压缩到optFriendlyARMmini2440书目下,依据我在UbUnIU下试验.2、设四环境变显在/etc/profi。中添加环境变量留意,须要重新注销或者source一下配置.文件profile,环境变量才能生效.第四章系统移植4.1 Uboot移植首先卜载u-boot2008.10,移植比较繁杂,参考mini2440的UboOt移植手册.4.2 .U-boot烧写4«3.1Uboot的功能Mini2440运用u-boot作为bootloader,通过它可以实现如下功能:I、烧写flash:2、引导1.inUX操作系统及其它程序:3、通过以太网卜我1.inUX内核或其它程序并引导.4。3.2运用DNW烧写u-boot通过USB的方式,首先须要安装USB驱动4.3 。3运用H-Jtag烧写uboot通过并行口的方式烧写,须要安装HjIag软件4。31.inux内核移植1.inUX内核的移植可以分为板级移植和片级移植.对于1.inUX发行版本中已经支持的CPU,通常只需针对板级硬件进行适当的修改即可,这种移植叫做板级移植;而对JZinux发行版本中没有支持的CpU,则须要添加相应的CPU的内核移植,这种移植叫做片级移植.片级移植相对板级移植来说要困难很多,须要对1.inUX内核有详尽的了解,本课题中所用的1.inUX中已经包含S3C2440ARM920T处理器的移植包,下面将在此基础上介绍1.inUX板级移植的基本过程和方法也图19为本课题所采纳的试验环境以及开发流程.安装交叉编译器a11n-linux-gcc:对1.inUX内核进行配置(makemcnuconfig),并选择适合本课题系统得相关配置:编译生成1.inUX映像文件UlmagC:通过u-boot的Ep吩咐符该文件下栽到目标板并执行.这将在下面的内容中作介绍。图19。JXARM924101.inUX开发流程4.3。I1.inuxkernel的下载4.3.31.inux内核的配置和编译1.1.inUX源代码结构1.inUX的源代码组织成如下结构.根书目是/home,1cvicchjx24IalinUX.内核的文件组织结构为1) arch/arm:及架构和平台相关的代码都放在arch书目下。fiiiRMJ1.inux,有个子书目和它对应一arm.2) drivers:包含全部的设备驱动程序。驱动程序又被分为“block“、“char”、Fef等几种类型。3) fs:这里有支持多种文件系统的源代码,几乎一个书目就是一个文件系统,如MSDoS、VF,PrOC和exi2等。4) include:相关的头文件。它们被分成通用和平台专用两部分.书目ARCH)”包含了平台相关的头文件。5)ini:含些启动kernel所需做的全部初始化动作,里面有个main。c.针对kernel做初始化动作、设置一些参数等,井对外国设备初始化。6) ipc:供应进程间通信机制的源代码,如信号量、消息队列和管道等。7) kernel:包含进程调度算法的源代码,以及及内核相关的处理程序,例如系统调用.8) mm:用来存放内存管理的源代码,包括MMi1.9) net:支持网络相关的协议源代码。IO)Iib:包含内核要用到的一些常用函数。如字符串操作、格式化输出等。H)SeriPl:包含在配置和编译内核时要用到的脚本文件。1.1 1.inUX内核源码移植修改参考mini2440的IinUX移植手册4.4 文件系统的移植nandflash采纳yafs2的文件系统4.5 加载1.inux内核映像1 .将mini2440的串口。及PC的串口连接,mini2440的网卡和PC的网卡运用直连网线进行连按,或者聘mini2440和PC机运用一般网线接入同一局域网。ARM试验箱的IP为192。168。k45,虚拟机下的1.inUX的IP设为192.168I.180.宿主机IP设为192“168.1.145.2 .将mini2440卜.电,正常状况下将在终端DNW中看到bootloader菜单界面。:bootloader中依据如图24的提示进行:4。6BoaWcb服务器的移植3 .6«1Boa的编译建立BoaWeb服务沿包括以下步骤:1 .下载Boa源代码。BoaWCb服务黯的源代码可以从下载,本文中下载文件为:boa-0.94.Elargz,为当前最新版本.2.安装并编译BOa源代码.1)通过VmWareTOOIS中的文件共享4Windows1'卜载的BOa源代码复制到/home,CVlCCIVjX2410cxamples书目F.2)竺源竺:#Cd/homecvtcchjx241Ocxamplcs#Cdboa/src生成MakCfilC文件#。/COnfigUrC3)修改Makefile文件,找到CC=gcc,将其改成CC=a11nIinuxgcc,再找到CPP=gccE,将其改成CPP=armJinUXgccE.并保存退出。4)运行make进行编译,在boa/src书目卜.将生成Boa文件,该文件即为BOaWeb服务器执行文件。将调试信息剥去,得到的最终程序只有约60KB大小。3。配置Boaweb服务器,使其能缈支持CGI程序的执行.Boa启动时聘加载一个配置文件boa。conf,在BOa程序运行前,必需首先编辑该文件,并将其放置FSrCMefinesh文件中SEVER-ROoT宏定义所定义的缺省节目,或者在启动BOa时运用参数“-c”指定boaconf的加教书目,在boaconf¾:件中须要进行一些配置,卜面作简要介绍:1) Port:该参数为boa服务器运行端口,缺省的端口为80。2) ScncrNamc:服务S名字3) DocumentRool:HTM1.文档根书目。建议运用肯定路径表示,如“,mntjfl2WCb”,假如运用相对路径,则它是相对服务器根节So4) ScripiAlias:指定CGl程序所在书目,殷全部的CGI脚本都要放在实际路径里,用户访问执行时输入站点+虚拟路径+CGl脚本名,本课题中CGI的路径设为:SCriPtAIiaSZcgibimnts2wcbibin/。5) CGIPath:binusrbinZusrZIocakbin,供应CGl程序的PATH环境变量值用户可以依据自己须要,对boaconf进行修改,但必须要保证其他的协助文件和设置必需和boaoCOnf里的配践相符,不然BOa就不能正常工作.在上面的例子中,我们还须要创建日志文件所在书HNaMogZboa用mime。types文件拷贝到ec书目.mime.Iypes文件用来指明不同文件扩展名对应的MIME类型,一般可以干脆从1.inUX主机上拷贝个,大部分也都是在主机的/etc书目下。4。71.inux下动态Web页面的实现本课题中通过CGl程序来获得用户的恳求、查询条件,运用HTM1.方式描述结果并干脆回送到客户端的阅读器上。生.成动态网页的步骤:(1)用户在阅读器中提出数据或查询条件的恳求,并执行“提交”后,便将思求信息发送到网上相应的Web服务器上;(2)Wcb服务器收到这一恳求便激活一个CGl程序(程序是驻留在Web服务器上的一个程序);(3)CGl程序调用该服务器下的全部程序或数据库,并完成读者须要的任务,同时将处理结果送回CGl网关接口:(4) 网关接口程序又将其结果转换成该服务器能识别的HTM1.文件格式,并确定CG【返回文档的类型;(5) Web服务冷将其结果送回阅读器中,阅读器进行数据处理并显示结果。由于C语言在平台无关性上表现不错(几乎在任何的系统平台卜.都有其相应编译器),而且对大多数程序员而言都兑得上很熟识(不像PCr1),因此,C是CGI编程的首选语言之一。CGi程序通常分为以下两部分.:依据PoST方法或GET方法从提交的表单中接受数据。本文中采纳的是GET方法。CGl程序必需检查REQUEST_METHoD环境变量以确定是否采纳了PoST方法,并确定是否要读取STDIN.用Prinlf()函数来产生HTM1.源代码,并将经过解码后的数据正确地返Pl给阅读器“将CGI测试程序CgijestZtaregz及制到/home,CVteChjx241Oexanles-目下。然后安装源代码:# Cdhomecvtechjx2410/examples# cdcgi-tes#make# cpcgi_test/t4.7.1CGl程序分析CGI程序见附录1 .在cgi.c中定义了main()函数:1)用“fom】_mcthod=gctRequcsiMcihod();“将调用POST/GET方法的信息存储在foEi_mcthotl中,调用POST,则为I;调用GET,则为0。2)以下程序先定义了若采纳GET方式则谑用函数getGETvaN();若采纳PoST方式则调用函数gctPOSTvars来处理表中。if(fb11n-netho<l=POST)(getvars=geiGETvars。;postvars=gctPOSTvars();CISCif(fbrm_mcthod=GET)getvars=geiGETvars。;I3)打印HTM1.表单,最终清空ARM中的CGl程序运用的缓存。htmlHeaderCDemoWebPage");htmlBody();tc11platc-page(postvars,fom-mclhcl)htmlFooter();CleanUP(fomi_method.getvars,postvars);fflush(stdout):2 .cgivarsc:D该程序中先首先将XX形式的十六进制的数字(ASal码)转换成字符,再按UR1.编码规则解码XX转换成字符.此部分程序将在6.5。2中给出具体分析。2)以下程序首先读入字符串信息,比较字符串推断采纳GET还是POST方式,信息返回到f11n-netho<l.requcst-mcthod=gctcnv("REQUEST-METHOD");if(request-meth<xi=NU1.1.)return-1;if(!strcmp(rcqucst_mcthod."GET")!strcmp(requestmethod."HEAD")forn-neihod=GET;elseif(!strcmp(request.method,"POST")(form_mcthod=POST;else(return-i;Jreturnfonn.method:3 )PoST和GET方式处理表单的程序见附录,假如恳求方法REQUESTMETHOD的值为GET,CGl程序读入环境变MQUESTRYSTRING:假如恳求方法为POST.CGI程序就可确定数据来自标准输入Vildin>,依据CONTENT1.ENGTH的值确定从(Sldin>读入的数据流大小.在完成表单处理后调用函数CleanUPO来释放缓存空间。3.3TM1.表单的制作ll)htmllib(>c及template。c.介要分析如卜.:Printf("Content-type:tcxVhtmlnn<HTM1.><HEAD><TIT1.E>%s<iT1.E><HEAD>".title);此行通过标准输出将字符申,Contenttype:texVhtnilnn<HI'M1.><HEAD><TIT1.E>%s<1.E)<HED)".title)传送给WCb服务器。它是一个MIME头信息,它告知WCb服务器陨后的输出是HTM1.源代码。请留意在这个头信息中有两个新行符,这是因为WCb服务器须要在实际的文本信息起先之前先望见一个空行。prinlfC<FORMACT10N="%s"METHOD=POST>","/cgi-bin/cgi_tcst");在HTMl,中参数action用以指明该CGI程式的位置,这样此表单所填的资料才能正确传给CGI作处理。传送资料给CGI的的方式,可选值为POST.GET,用method来定义,此处定义为POST方式.3)三s三三printf(,<BR><INPUTTYPE=SubmitVA1.UE=VSubmitC");printf("<lNPUTTYPE=resetVA1.UE="Rescl">");<INPUT)的参数设定,typc="Submit”设定输入方式为Submit或RCsCt.valuc="submit“或者“RCsC广,这个值不是输给CGI的,而是显示在按键上,可以不用,传送键的内定值为SubmitQuery,消除键的内定值为Reset.4.7.2Form输入的分析和解码当用户提交一个HTM1.FormlM.Web阅读器首先对FOrm中的数据以名字/值对的形式进行编码,并发送给Web服务器.然后由WCb服务器传递给CGI程序.其格式如卜Znamcl=valucl&namc2=valuc2&namc3=valuc3&nanic4=vakic4&.其中名字是FOrm中定义的INPUT、SE1.ECT或TEXTAREA等标置(Thg)名字,值是用户输入或选择的标置值。这种格式即为UR1.编码,程序中须要对其进行分析和解码。要分析这种数据流CGI程序必需首先将数据流分解成一组组的名字/值对。这可以通过在输人流中查找卜.面的两个字符来完成。每当找到字符=,标记着一个Fonn变量名字的结束:每当找到字符&,标记若一个FOrm变量值的结束.请留意输入数据的最终个变量的值不以&结束.一旦名字/值对分解后.还必需将输入中的一些特殊字符转换成相应的ASCll字符.这些特殊字符是:+:将+转换成空格符;%xx:用其十六进制ASCu码值表示的特殊字符.依据值XX将其转换成相应的ASClI字符。对Form变量名和变量值都要进行这种转换,卜面是CGl中对Form数据进行分析并将结果回送给Web服务罂的程序的分析.charhex2char(char*hex)charChajValue;char_value=(hcxO>='A"?(hcxO)&OxdO-'A')+10:(hcxO-'O');Char_value*=16;char.valuc+=(hcxl>=,A,?(hcxl&OXdf)-'A,)+10:(hcxl-,O');returnchar_valuc;voidunescape_url(char*url)intn.k;fbr(n=O.k=Oiurl(k+n.+k)iR(urln=url(k)='%')urln=hex2char(&urlk+l);k+=2;urln=,O,上述程序首先将XX形式的十六进制的数字(ASCn码)转换成字符,再按UR1.编码规则解码XX转换成字符。