




已阅读5页,还剩76页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第12章嵌入式BOA服务器的构建,随着Internet技术的兴起,在嵌入式设备的管理与交互中,基于Web方式的应用成为目前的主流,这种程序结构也就是大家非常熟悉的C/S结构,即在嵌入式设备上运行一个支持脚本或CGI功能的Web服务器,能够生成动态页面,在用户端只需要通过Web浏览器就可以对嵌入式设备进行管理和监控,非常方便实用。本章主要介绍这种应用的开发和移植工作。,Page1,机械工业出版社,08/13/12,第12章嵌入式BOA服务器的构建,Page2,机械工业出版社,08/13/12,12.1概述,下面简介下嵌入式web服务器。由于嵌入式设备资源一般都比较有限,并且也不需要能同时处理很多用户的请求,因此不会使用Linux下最常用的如Apache等服务器,而需要使用一些专门为嵌入式设备设计的Web服务器,这些Web服务器在存贮空间和运行时所占有的内存空间上都会非常适合于嵌入式应用场合。常见的嵌入式Web服务器主要有:lighttpd、thttpd、shttpd和BOA等等。,Page3,机械工业出版社,08/13/12,1.lighttpdlighttpd是一个德国人领导的开源软件,其根本的目的是提供一个专门针对高性能网站,安全、快速、兼容性好并且灵活的webserver环境,具有非常低的内存开销,CPU占用率低,效能好,以及丰富的模块等特点。lighttpd是众多OpenSource轻量级的webserver中较为优秀的一个。支持FastCGI、CGI、Auth、输出压缩(outputcompress)、URL重写、Alias等重要功能,而Apache之所以流行,很大程度也是因为功能丰富,在lighttpd上很多功能都有相应的实现了,这点对于apache的用户是非常重要的,因为迁移到lighttpd就必须面对这些问题。,Page4,机械工业出版社,08/13/12,2.thttpdthttpd是一个非常小巧的轻量级webserver,它非常简单,仅仅提供了HTTP/1.1和简单的CGI支持,在其官方网站上有一个与其他webserver(如Apache,Zeus等)的对比图+Benchmark可以参考。此外,thttpd也类似于lighttpd,对于并发请求不使用fork()来派生子进程处理,而是采用多路复用(Multiplex)技术来实现,因此效能很好。thttpd支持多种平台,如FreeBSD、SunOS、Solaris、BSD、Linux、OSF等。对于小型webserver而言,速度快似乎是一个代名词,通过官方站提供的Benchmark,可以这样认为:thttpd至少和主流的webserver一样快,在高负载下更快,因为其资源占用小的缘故。thttpd还有一个较为引人注目的特点:基于URL的文件流量限制,这对于下载的流量控制而言是非常方便的。像Apache就必须使用插件实现,效率较thttpd低。,Page5,机械工业出版社,08/13/12,3.shttpdshttpd是另一个轻量级的webserver,具有比thttpd更丰富的功能特性,支持CGI、SSL、cookie、MD5认证,还能嵌入(embedded)到现有的软件里,而且不需要配置文件。由于shttpd可以嵌入其他软件,因此可以非常容易的开发嵌入式系统的webserver,官方网站上称shttpd如果使用uclibc/dielibc(libc的简化子集)则开销将非常非常低。,Page6,机械工业出版社,08/13/12,4.BOABOA是一个非常小巧的Web服务器,可执行代码只有约60KB。它是一个单任务Web服务器,只能依次完成用户的请求,而不会fork出新的进程来处理并发连接请求。但BOA支持CGI,能够为CGI程序fork出一个进程来执行。BOA的设计目标是速度和安全,在其站点公布的性能测试中,BOA的性能要好于Apache服务器。,Page7,机械工业出版社,08/13/12,12.2嵌入式Linux系统移植,12.2.1开发环境的构建12.2.2BootLoader分析移植12.2.3Linux内核移植12.2.4构建根文件系统,Page8,机械工业出版社,08/13/12,嵌入式应用程序的开发流程不同于普通的PC机。相比于普通的PC机,嵌入式的硬件资源相当的有限,不可能进行本地的开发。因而,嵌入式的软件开发和调试过程通常是在PC机上实现的。这样就形成了一套在PC机上交叉编译,然后生成目标机平台的格式,最后在目标机上执行的开发流程,也就是所谓的交叉编译环境。本文使用的是DebianGNU/Linux的操作系统作为开发平台。首先可以从获取Debian最新的稳定版。正确安装好Debian以后,下一步就要建立一套跨平台的交叉编译工具链。,12.2.1开发环境的构建,Page9,机械工业出版社,08/13/12,制作一个支持softfloat的交叉编译工具链:(1)解压缩crosstool-0.43.tar.gz,把补丁文件glibc-2.3.6-version-info.h_err.patch复制到crosstool-0.43/patches/glibc-2.3.6/目录下,它修改了glibc-2.3.6/csu/Makefile里面的一个小错误,导致生成的version-info.h文件编译出错。(2)修改demo-arm-softfloat.sh脚本,指定编译过程中所需软件包的存放路径TARBALLS_DIR=$HOME/downloads,指定交叉编译工具链的存放路径RESULT_TOP=/usr/local/crosstool,需要事先创建好该路径保证其具有可写的权限。(3)修改arm-softfloat.dat文件,指定TARGET=arm-linux,保证编译出来的工具是常用的名字。(4)修改all.sh脚本,指定安装路径为PREFIX=$PREFIX-$RESULT_TOP/$TOOLCOMBO。(5)最后以普通用户身份执行./demo-arm-softfloat.sh,大约12个小时就编译好了。此时将交叉编译工具链加入PATH环境变量中就可以使用了。,Page10,机械工业出版社,08/13/12,对于计算机系统来说,从开机上电到操作系统启动需要一个引导过程。嵌入式Linux系统同样离不开引导程序,这个引导程序就叫作BootLoader。BootLoader是在操作系统运行之前执行的一段小程序。通过这段小程序可以初始化硬件设备、建立内存空间的映射表,从而建立适当的系统软硬件环境,为最终调用操作系统内核做准备。BootLoader的实现非常依赖于具体的硬件。正因如此,几乎不可能为所有的嵌入式系统建立一个通用的BootLoader。,12.2.2BootLoader分析移植,Page11,机械工业出版社,08/13/12,BootLoader主要分为两种操作模式:启动加载(Bootloading)模式:这种模式也称为自主模式,即BootLoader从目标机上的某个固态存储设备上将操作系统加载到RAM中运行,整个过程并没有用户的介入。这种模式是BootLoader的正常工作模式,因此在嵌入式产品发布的时候,BootLoader显然必须工作在这种模式下。下载(Downloading)模式:在这种模式下,目标机上的BootLoader将通过串口连接或者网络连接等通信手段从主机下载文件。从主机下载的文件通常首先被BootLoader保存到目标机的RAM中,然后再被BootLoader写到目标机上的Flash存储设备中。,Page12,机械工业出版社,08/13/12,12.2.3Linux内核移植,表12-1Linux内核子目录结构,Page13,机械工业出版社,08/13/12,Page14,机械工业出版社,08/13/12,Page15,机械工业出版社,08/13/12,内核的源代码可以从获取:1.首先解压缩内核源代码,修改顶层的Makefile文件ARCH?=armCROSS_COMPILE?=arm-linux-这里需要指定目标平台的体系结构和交叉编译工具链的路径。2.修改linux-/arch/arm/mach-s3c2440/mach-smdk2440.c文件s3c24xx_init_clocks(16934400)修改为s3c24xx_init_clocks(12000000)指定开发板的晶振频率为12MHz。,Page16,机械工业出版社,08/13/12,3.修改linux-/arch/arm/plat-s3c24xx/common-smdk.c文件,staticstructmtd_partitionsmdk_default_nand_part=0=.name=kernel,.size=0 x00200000,.offset=0,,1=.name=rootfs,.offset=MTDPART_OFS_APPEND,.size=MTDPART_SIZ_FULL,;,Page17,机械工业出版社,08/13/12,下一步,就是进行内核的配置了。这里可以参考S3C2410的开发板来进行配置和调整,内核自带了S3C2410开发板的配置文件。在内核源代码根目录下,执行makes3c2410_defconfig,生成一个基于S3C2410的开发板的默认配置文件。然后再执行makemenuconfig会生成一个基于S3C2410开发板的内核配置菜单。这里需要保留S3C2410/S3C2440CPU的相关配置选项、TCP/IP协议、NANDFlash驱动、USB驱动以及适合的文件系统类型。,Page18,机械工业出版社,08/13/12,本文中采用的是JFFS2的文件系统类型。内核默认已经对JFFS2有着非常良好的支持,只需要在配置内核的时候加入相应的配置选项就可以了。JFFS2文件系统配置如下:,Filesystems-Miscellaneousfilesystems-JournallingFlashFileSystemv2(JFFS2)support(0)JFFS2debuggingverbosity(0=quiet,2=noisy)(NEW)*JFFS2write-bufferingsupport(NEW)VerifyJFFS2write-bufferreads(NEW)JFFS2summarysupport(EXPERIMENTAL)(NEW)JFFS2XATTRsupport(EXPERIMENTAL)(NEW)AdvancedcompressionoptionsforJFFS2(NEW),Page19,机械工业出版社,08/13/12,Linux遵守文件系统科学分类标准(FilesystemHierarchyStandard,FHS),一个定义许多文件和目录的名字和位置的标准,该标准可以在,12.2.4构建根文件系统,Page20,机械工业出版社,08/13/12,构建Linux根文件系统,就是按照FHS标准,创建各种目录、工具和配置文件。这里首先通过Busybox来创建可执行文件。Busybox最初是由BrucePerens在1996年为DebianGNU/Linux安装盘编写的。其目标是在一张软盘上创建一个可引导的GNU/Linux系统,这可以用作安装盘和急救盘。一张软盘可以保存大约1.41.7MB的内容,因此这里没有多少空间留给Linux内核以及相关的用户应用程序使用。,Page21,机械工业出版社,08/13/12,1、首先解压缩源代码,修改顶层Makefile2、执行makemenuconfig生成一个配置菜单。这里,只需选择默认配置就可以了。3、最后执行make进行编译,执行makeinstall进行安装。这样会在当前目录下生成一个_install目录。,Page22,机械工业出版社,08/13/12,可执行文件创建好以后,接下来需要建立lib目录,并且复制所需要的共享库。可以通过arm-linux-readelf-abusybox|grepShared命令来查看Busybox调用了哪些共享库,然后将其中对应的共享库复制到lib目录中就可以了。下面根据FHS标准,构建etc配置目录。,1.创建inittab文件,#Systeminitialization.:sysinit:/etc/init.d/rcS:ctrlaltdel:/sbin/reboot:shutdown:/sbin/swapoff-a:shutdown:/bin/umount-a:restart:/sbin/init:askfirst:-/bin/sh,Page23,机械工业出版社,08/13/12,2.创建init.d/rcS文件,#!/bin/shPATH=/bin:/sbin:/usr/bin:/usr/sbinexportPATHumask022/bin/mount-a/bin/mount-ttmpfsmdev/dev/bin/mkdir/dev/pts/bin/mount-tdevptsdevpts/dev/pts,Page24,机械工业出版社,08/13/12,/bin/mount-tsysfssysfs/sysecho/sbin/mdev/proc/sys/kernel/hotplug/sbin/mdev-s/bin/mount-tramfsramfs/var/bin/mkdir-p/var/run/bin/mkdir-p/var/log/bin/hostnamehrbeu06ws/sbin/syslogd,Page25,机械工业出版社,08/13/12,3.创建fstab文件,#devicemount-pointtypeoptionsdumpfsckorderproc/procprocdefaults00tmpfs/tmptmpfsdefaults00tmpfs/devtmpfsdefaults00,Page26,机械工业出版社,08/13/12,4.建立dev目录下必备的设备节点,sudomknodconsolec51sudomknodnullc13,5.创建passwd文件,root:*:0:0:root:/root:/bin/sh,Page27,机械工业出版社,08/13/12,6.创建shadow文件,root:$1$5qCxLMsr$jJgsPqDW8ZJOS8LE4c5n50:0:0:99999:7:1:,7.创建group文件,root:0:,Page28,机械工业出版社,08/13/12,8.创建profile文件,#/etc/profile:filefilefortheBourneshellif$PS1;thenif$(id-u)-eq0;thenPS1=uh:w#elsePS1=uh:w$fifiHOME=/rootexportHOME,Page29,机械工业出版社,08/13/12,9.创建resolv.conf文件,nameserver,10.复制主机的inetd.conf、protocols、mime.types和services文件,其中定义了常见的网络服务的端口和协议。,11.最后,创建一些必要的空目录,mkdirmntprocrootsystmpvar,Page30,机械工业出版社,08/13/12,12.3嵌入式Linux的BOA服务器移植,12.3.1CGI简介12.3.2BOA服务器12.3.3CGIC库的移植12.3.4HTML模板的制作12.3.5CGI程序的开发,Page31,机械工业出版社,08/13/12,目前Web技术中生成动态Web页面的方法有CGI和服务器脚本,如JSP、ASP等,但后者需要Web服务器具有这些脚本的运行支持模块。在嵌入式Web服务器中,考虑到资源限制问题,一般都只提供CGI支持,因此在嵌入式设备中Web方式应用实际上就是基于CGI的程序开发。,12.3.1CGI简介,Page32,机械工业出版社,08/13/12,CGI(CommonGateIntergace)是一段运行在Web服务器上的程序,提供同客户端Html页面的接口。例如,常见的个人主页上大都有一个留言本,留言本的工作方式是先由用户输入一些信息,如名字之类的东西,接着用户按一下“留言”(到目前为止工作都在客户端),浏览器就把这些信息传送到服务器的CGI程序中,于是CGI程序在服务器上按照预定的方法进行处理,在本例中就是把用户提交的信息存入指定的文件中,最后CGI程序给客户端发回一个“留言结束”字样的页面,用户可以在浏览器里看到。,Page33,机械工业出版社,08/13/12,BOA服务器对CGI的表现非常的出色,其应用十分广泛。BOA的源代码可以从http:/www.BOA.org下载。本文使用的是BOA-0.94.14rc21.tar.gz。首先解压缩源代码tarxvfBOA-0.94.14rc21.tar.gz。查看其中的目录结构,包括src、docs、examples、debian等等。这里src是BOA的源代码目录,其中包含了编译过程中所需要的一些文件。进入src目录以后,目录下有一个configure脚本文件,其检测本机的开发环境用来生成Makefile文件。,12.3.2BOA服务器,Page34,机械工业出版社,08/13/12,通过执行./configureh来查看一些常用的帮助选项:其中比较主要的有:-prefix,指定了安装时的路径。-host指定了生成的平台类型。CC指定了编译器的类型等等。,这里,首先通过configure生成一个Makefile文件,如下:./configurehost=arm-linuxCC=arm-linux-gcc。接下来,查看生成的Makefile文件,修改其中的CC=arm-linux-gcc,CPP=arm-linux-g+等。下一步,只需要执行make命令就可以调用Makefile来生成所需要的BOA。这里,可以去除BOA的调试信息,以减小它的体积,输入arm-linux-stripBOA就可以了。接着把生成的BOA复制到nfs共享目录中,启动主机的nfs服务,启动开发板,设置内核自动挂载nfs网络文件系统。启动开发板以后,在终端下输入BOA,还需要建立一个BOA的配置文件。,Page35,机械工业出版社,08/13/12,在BOA源码目录下已有一个示例BOA.conf,可以在其基础上进行修改,下面解释一下该文件的含义:监听的端口号,缺省都是80,一般无需修改:,Port80,bind调用的IP地址,一般注释掉,表明绑定到INADDR_ANY,通配于服务器的所有IP地址:,#Listen,Page36,机械工业出版社,08/13/12,作为哪个用户运行,即它拥有该用户的权限,一般都是nobody,需要/etc/passwd中有#nobody用户:,Usernobody,作为哪个用户组运行,即它拥有该用户组的权限,一般都是nogroup,需要在/etc/group文件中有nogroup组:,Groupnogroup,当服务器发生问题时发送报警的email地址,目前未用,注释掉:,ServerAdminrootlocalhost,Page37,机械工业出版社,08/13/12,错误日志文件,如果没有以/开始,则表示从服务器的根路径开始,如果不需要错误日志,则用#/dev/null。在下面设置时,注意一定要建立/var/log/BOA目录:,ErrorLog/var/log/BOA/error_log,访问日志文件,如果没有以/开始,则表示从服务器的根路径开始,如果不需要错误日志,则用#/dev/null或直接注释掉。在下面设置时,注意一定要建立/var/log/BOA目录:,#AccessLog/var/log/BOA/access_log,Page38,机械工业出版社,08/13/12,是否使用本地时间。如果没有注释掉,则使用本地时间。注释掉则使用UTC时间:,#UseLocaltime,是否记录CGI运行信息,如果没有注释掉,则记录,注释掉则不记录:,#VerboseCGILogs,服务器名字:,ServerN,Page39,机械工业出版社,08/13/12,是否启动虚拟主机功能,即设备可以有多个网络接口,每个接口都可以拥有一个虚拟的Web服务器。一般注释掉,即不需要启动:,#VirtualHost,HTML文档的主目录,如果没有以/开始,则表示从服务器的根路径开始:,DocumentRoot/var/www,如果收到一个用户请求的话,在用户主目录后再增加的目录名:,UserDirpublic_html,Page40,机械工业出版社,08/13/12,HTML目录索引的文件名,也是没有用户只指明访问目录时返回的文件名:,DirectoryIndexindex.html,当HTML目录没有索引文件时,用户只指明访问目录时,BOA会调用该程序生成索引文件然后返回给用户,因为该过程比较慢最好不执行,可以注释掉或者给每个HTML目录加上DirectoryIndex指明的文件:,#DirectoryMaker/usr/lib/BOA/BOA_indexer,Page41,机械工业出版社,08/13/12,如果DirectoryIndex不存在,并且DirectoryMaker被注释,那么就用BOA自带的索引生成程序来生成目录的索引文件并输出到下面目录,该目录必须是BOA能读写:,#DirectoryCache/var/spool/BOA/dircache,一个连接所允许的HTTP持续作用请求最大数目,注释或设为0都将关闭HTTP持续作用,KeepAliveMax1000,Page42,机械工业出版社,08/13/12,HTTP持续作用中服务器在两次请求之间等待的时间数,以秒为单位,超时将关闭连接:,KeepAliveTimeout10,指明mime.types文件位置。如果没有以/开始,则表示从服务器的根路径开始。可以注释掉,避免使用mime.types文件,此时需要用AddType在本文件里指明:,MimeTypes/etc/mime.types,Page43,机械工业出版社,08/13/12,文件扩展名没有或未知的话,使用的缺省MIME类型:,DefaultTypetext/plain,提供CGI程序的PATH环境变量值:,CGIPath/bin:/usr/bin:/usr/local/bin,将文件扩展名和MIME类型关联起来,和mime.types文件作用一样。如果用mime.types,文件,则注释掉,如果不使用mime.types文件,则必须使用:,#AddTypeapplication/x-httpd-cgicgi,Page44,机械工业出版社,08/13/12,指明文档重定向路径:,#Redirect/barhttp:/elsewhere/feh/bar,为路径加上别名:,Alias/doc/usr/doc,指明CGI脚本的虚拟路径对应的实际路径。一般所有的CGI脚本都要放在实际路径里,用户访问执行时输入站点+虚拟路径+CGI脚本名:,ScriptAlias/cgi-bin/var/www/cgi-bin/,Page45,机械工业出版社,08/13/12,用户可以根据自己需要,对BOA.conf进行修改,但必须要保证其他的辅助文件和设置必须和BOA.conf里的配置相符,不然BOA就不能正常工作。在上面的例子中,还需要创建日志文件所在目录/var/log/BOA,创建HTML文档的主目录/var/www,将mime.types文件拷贝到/etc目录,创建CGI脚本所在目录/var/www/cgi-bin/。mime.types文件用来指明不同文件扩展名对应的MIME类型,一般可以直接从Linux主机上拷贝一个,大部分也都是在主机的/etc目录下。,Page46,机械工业出版社,08/13/12,还要修改一下BOA的启动脚本,以方便控制BOA的运行。修改debian目录下BOA.init文件,#!/bin/sh#WrittenbyMiquelvanSmoorenburg.#ModifiedforDebianGNU/Linux#byIanMurdock.#ModifiedforBOAbyBillAllombert.#BEGININITINFO#Provides:BOA#Required-Start:$local_fs$remote_fs$network#Required-Stop:$local_fs$remote_fs$network,Page47,机械工业出版社,08/13/12,#Default-Start:2345#Default-Stop:016#Short-Description:BOA:lightweightandhighperformancewebserver#ENDINITINFOPATH=/sbin:/bin:/usr/sbin:/usr/binDAEMON=/usr/sbin/BOANAME=BOADESC=HTTPservertest-x$DAEMON|exit0set-ecase$1instart),Page48,机械工业出版社,08/13/12,echo-nStarting$DESC:$NAMEstart-stop-daemon-start-quiet-exec$DAEMONecho.;stop)echo-nStopping$DESC:$NAMEstart-stop-daemon-stop-quiet-oknodo-exec$DAEMONecho.;restart)echo-nRestarting$DESC:$NAME.start-stop-daemon-stop-signalHUP-quiet-oknodo-exec$DAEMONechodone.;,Page49,机械工业出版社,08/13/12,reload)#Ifthedaemoncanreloaditsconfigfilesonthefly#forexamplebysendingitSIGHUP,doithere.#Ifthedaemonrespondstochangesinitsconfigfile#directlyanyway,makethisado-nothingentry.#echo-nReloading$DESCconfiguration.start-stop-daemon-stop-signal1-quiet-oknodo-exec$DAEMONechodone.;*),Page50,机械工业出版社,08/13/12,N=/etc/rc.d/init.d/$NAME#echoUsage:$Nstart|stop|restart|reload|force-reloadesacexit0,Page51,机械工业出版社,08/13/12,第三步就是测试BOA能否正常工作,静态HTML页面能否正常访问,CGI脚本能否正常运行,一般采用NFS方式来进行测试工作,可以将嵌入式目标系统上的/etc目录拷贝到主机的NFS共享目录下,然后将NFS共享目录下的etc目录重新NFSmount为目标系统上的/etc目录。这样就可以在主机上对etc目录下的各种配置文件进行修改而立刻在目标系统上生效。,Page52,机械工业出版社,08/13/12,接下来进行CGI脚本的测试,需要一个测试用的CGI脚本。可以写个最简单的HelloWorld程序,示例代码如下:,#includevoidmain()printf(Content-type:text/htmlnn);printf(n);printf(n);printf(n);printf(Hello,world.n);printf(n);printf(n);exit(0);,Page53,机械工业出版社,08/13/12,然后进行交叉编译,将得到的helloworld.cgi拷贝到主机的/nfs/www/cgi-bin目录下。,#arm-linux-gcc-ohelloworld.cgihelloworld.c#cphelloworld.cgi/nfs/www/cgi-bin,在浏览器地址栏输入/cgi-bin/helloworld.cgi,可以看到相关页面,表示CGI脚本测试通过。,Page54,机械工业出版社,08/13/12,在进行CGI编程之前,先了解HTML的一些知识。CGI可以使用多种编程语言来实现,包括C、C+、Perl等,但在嵌入式设备的开发中,一般都不会采用Perl等解释性语言,因为这种语言还需要有解释执行的支撑模块,会占用存贮空间和内存,最常用的方法当然是用C来编写,但C并不是很适合开发象CGI这种需要大量进行字符串操作的程序,编程比较烦琐,因此,对于一个专业的开发人员来说,首先想到的应该是有没有可复用的库来支持快速高效的开发CGI程序。幸运的是目前就有不少开放源码的支持CGI开发的C库。在此只介绍CGIC,有兴趣的读者可以自己在Internet上搜索其他的C库。,12.3.3CGIC库的移植,Page55,机械工业出版社,08/13/12,CGIC是一个支持CGI开发的开放源码的标准C库,可以免费使用,只需要在开发的站点和程序文档中有个公开声明即可,表明程序使用了CGIC库,用户也可以购买商业授权而无需公开声明。CGIC能够提供以下功能:,1.分析数据,并自动校正一些有缺陷的浏览器发来的数据;2.透明接收用GET或POST方法发来的From数据;3.能接受上传文件;4.能够设置和接收cookies;5.用一致的方式处理From元素里的回车;6.提供字符串、整数、浮点数、单选或多选功能来接收数据;7.提供数字字段的边界检查;8.能够将CGI环境变量转化成C中的非空字符串;9.提供CGI程序的调试手段,能够回放CGI程序执行时的CGI状态;,Page56,机械工业出版社,08/13/12,下载后,解压到“/opt/EmbedSky/”目录下,会生成目录cgic205:#tarxvfzcgic205.tar.gz配置编译条件,进入cgic205目录,修改Makefile文件。下面是修改后的文件内容:,CFLAGS=-g-WallCC=arm-linux-gcc/原来是CC=gccAR=arm-linux-ar/原来是AR=arRANLIB=arm-linux-ranlib/原来是RANLIB=ranlibLIBS=-L./-lcgicall:libcgic.acgictest.cgicaptureinstall:libcgic.acplibcgic.a/usr/local/libcpcgic.h/usr/local/include,Page57,机械工业出版社,08/13/12,echolibcgic.aisin/usr/local/lib.cgic.hisin/usr/local/include.libcgic.a:cgic.ocgic.hrm-flibcgic.a$(AR)rclibcgic.acgic.o$(RANLIB)libcgic.a#mingw32andcygwinusers:replace.cgiwith.execgictest.cgi:cgictest.olibcgic.a$(CC)$(CFLAGS)cgictest.o-ocgictest.cgi$LIBS/由gcc改成了:$(CC)$(CFLAGS)capture:capture.olibcgic.a$(CC)$(CFLAGS)capture.o-ocapture$LIBS/由gcc改成了:$(CC)$(CFLAGS)clean:rm-f*.o*.acgictest.cgicapture,Page58,机械工业出版社,08/13/12,修改后保存退出,下面编译并优化。编译,会在目录下生成capture的可执行文件和测试用的cgictest.cgi文件:,#make,优化:,#arm-linux-stripcapture,会把capture由原来的100K左右变成现在的29K左右。,Page59,机械工业出版社,08/13/12,Web方式的应用开发一般都会将界面和程序逻辑脱离开来,允许在一定程度下更改界面,如改变界面文本的属性,建立多语言版本等,而无需改动程序逻辑。界面一般由美工来进行制作,而程序员负责具体功能的实现。在HTML中,表单(FORM)是最主要的传递信息的手段,它适用于任何浏览器。表单中有很多元素,包括输入文本框、单选框、多选框、按钮等等,可以提供信息的交互。具体对象说明和语法请参见其他HTML书籍,在这里不作介绍。根据应用需求,美工或其他设计人员将最后的Web页面设计出来,作为程序员进行开发的模板。,12.3.4HTML模板的制作,Page60,机械工业出版社,08/13/12,HTML模板还需要关注的是输入的检查。根据输入检查越早越好的原则,需要在用户界面上就对用户提交的数据进行检查。目前一般是采用javascript脚本的方式。当用户提交数据时,表单对象的onSubmit方法就会被调用,在该方法里就可以对用户的输入进行检查。常用的检查有是否必需、最大/小长度、是否字符、是否数字、email地址、IP地址是否正确、是否匹配一个正则表达式等。,Page61,机械工业出版社,08/13/12,CGI程序一般逻辑为:1安全性检查,是否允许运行脚本;2处理用户提交的数据,根据元素名字/值中的元素名字来区分数据,然后根据应用需求进行数据处理;3将处理结果填充表单,根据注释标记将对应的数据填充到HTML文本中去,生成最后的页面返回给浏览器。,12.3.5CGI程序的开发,Page62,机械工业出版社,08/13/12,下面介绍几个有关CGI的源码:,/*此程序可以测试web服务上传的字符串信息*/#include#include#include#includevoidmain()/*LINUX下必须返回值类型为int,并且相应的返回处应该添加上相*/if(getenv(CONTENT-LENGTH)char*s=getenv(CONTENT-LENGTH);printf(s);printf(Contenttype:text/htmlnn);,Page63,机械工业出版社,08/13/12,printf(n);printf(这是测试POST方法n);printf(n);printf(这是测试POST方法n);printf(s);printf(n);printf(Gobacktooutput.htmlpagen);printf(n);printf(n);fflush(stdout);/*converthexstringtoint*/*主要转换汉字编码的格式*/inthtoi(char*s),Page64,机械工业出版社,08/13/12,char*digits=0123456789ABCDEF;if(islower(s0)s0=toupper(s0);if(islower(s1)s1=toupper(s1);return16*(strchr(digits,s0)-strchr(digits,0)+(strchr(digits,s1)-strchr(digits,0);voidmain()printf(Contenttype:text/plainnn);printf(n);printf(这是测试POST方法n);printf(n);printf();printf();printf();printf(这是测试POST方法n);printf();/*/*取出的数值在nValue中*/inti,n;charc;intnSum=1;/*总共几个变量*/charnStr1000;/*存放整个上传的数据串,最多1000个*/memset(nStr,0,1000);/*将10个变量清零*/charnCurrentValue200;/*当前取出的值*/charnValueName1050;/*变量名称*/memset(nValueName,0,500);/*将10个变量名称清零*/,Page66,机械工业出版社,08/13/12,charnValue10100;/*最多10个变量,每个变量最大100个字符*/memset(nValue,0,1000);/*将10个变量清零*/intnIndex=0;/*当前变量索引*/intnPosion=0;/*当前操作的变量的第几个字符*/intiseq=0;/*每个变量开始标志*/n=0;if(getenv(CONTENT_LENGTH)=NULL)return;/*web服务器环境不存在*/CONTENT_LENGTH环境变量n=atoi(getenv(CONTENT_LENGTH);/*将所有字符串长度变成整型值*/printf(数据长度%d,n);,Page67,机械工业出版社,08/13/12,for(i=0;in;i+)c=getchar();/*从标准输入取一个字符*/nStri=c;/*下面主要是对URL编码的解码*/switch(c)casecase+:/*空格变换*/,Page68,机械工业出版社,08/13/12
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 江苏工程职业技术学院《数字媒体艺术史研究》2023-2024学年第一学期期末试卷
- 洗车店搞活动方案
- 淘宝年前活动方案
- 活动方案创意方案
- 海鲜酒楼开业活动方案
- 洗车推广活动方案
- 浓情邻里一家亲活动方案
- 涂色比赛活动方案
- 泳装线下活动方案
- 活动推广舞蹈活动方案
- 山东省济南市历城区2022-2023学年六年级下学期期末数学试卷
- 嘉峪关市招聘公办幼儿园编制外聘用制教师考试真题2022
- 农村小城镇建设论文3000字范文
- 重症患者SOFA评分表实用文档
- 2022年7月浙江省普通高校招生学考科目考试历史试题及答案
- 特种设备压力管道基础知识
- GB/T 5976-2006钢丝绳夹
- GB/T 18981-2008射钉
- 新《高等教育学》考试复习题库450题(含各题型)
- CSC-2000变电站自动监控系统使用说明书
- MES七大功能-MES项目解决方案
评论
0/150
提交评论