嵌入式Linux编程入门与开发实例-嵌入式BOA服务器的构建-课件_第1页
嵌入式Linux编程入门与开发实例-嵌入式BOA服务器的构建-课件_第2页
嵌入式Linux编程入门与开发实例-嵌入式BOA服务器的构建-课件_第3页
嵌入式Linux编程入门与开发实例-嵌入式BOA服务器的构建-课件_第4页
嵌入式Linux编程入门与开发实例-嵌入式BOA服务器的构建-课件_第5页
已阅读5页,还剩76页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第12章嵌入式BOA服务器的构建

随着Internet技术的兴起,在嵌入式设备的管理与交互中,基于Web方式的应用成为目前的主流,这种程序结构也就是大家非常熟悉的C/S结构,即在嵌入式设备上运行一个支持脚本或CGI功能的Web服务器,能够生成动态页面,在用户端只需要通过Web浏览器就可以对嵌入式设备进行管理和监控,非常方便实用。本章主要介绍这种应用的开发和移植工作。

1ppt课件第12章嵌入式BOA服务器的构建概述

12.1嵌入式Linux系统移植12.2嵌入式Linux的BOA服务器移植

12.32ppt课件12.1概述

下面简介下嵌入式web服务器。由于嵌入式设备资源一般都比较有限,并且也不需要能同时处理很多用户的请求,因此不会使用Linux下最常用的如Apache等服务器,而需要使用一些专门为嵌入式设备设计的Web服务器,这些Web服务器在存贮空间和运行时所占有的内存空间上都会非常适合于嵌入式应用场合。常见的嵌入式Web服务器主要有:lighttpd、thttpd、shttpd和BOA等等。

3ppt课件1.lighttpd

lighttpd是一个德国人领导的开源软件,其根本的目的是提供一个专门针对高性能网站,安全、快速、兼容性好并且灵活的webserver环境,具有非常低的内存开销,CPU占用率低,效能好,以及丰富的模块等特点。

lighttpd是众多OpenSource轻量级的webserver中较为优秀的一个。支持FastCGI、CGI、Auth、输出压缩(outputcompress)、URL重写、Alias等重要功能,而Apache之所以流行,很大程度也是因为功能丰富,在lighttpd

上很多功能都有相应的实现了,这点对于apache的用户是非常重要的,因为迁移到lighttpd就必须面对这些问题。4ppt课件2.thttpd

thttpd是一个非常小巧的轻量级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低。5ppt课件3.shttpd

shttpd是另一个轻量级的webserver,具有比thttpd更丰富的功能特性,支持CGI、SSL、cookie、MD5认证,还能嵌入(embedded)到现有的软件里,而且不需要配置文件。由于shttpd可以嵌入其他软件,因此可以非常容易的开发嵌入式系统的webserver,官方网站上称shttpd如果使用uclibc/dielibc(libc的简化子集)则开销将非常非常低。6ppt课件4.BOABOA是一个非常小巧的Web服务器,可执行代码只有约60KB。它是一个单任务Web服务器,只能依次完成用户的请求,而不会fork出新的进程来处理并发连接请求。但BOA支持CGI,能够为CGI程序fork出一个进程来执行。BOA的设计目标是速度和安全,在其站点公布的性能测试中,BOA的性能要好于Apache服务器。7ppt课件12.2嵌入式Linux系统移植12.2.1开发环境的构建12.2.2BootLoader分析移植12.2.3Linux内核移植12.2.4构建根文件系统8ppt课件

嵌入式应用程序的开发流程不同于普通的PC机。相比于普通的PC机,嵌入式的硬件资源相当的有限,不可能进行本地的开发。因而,嵌入式的软件开发和调试过程通常是在PC机上实现的。这样就形成了一套在PC机上交叉编译,然后生成目标机平台的格式,最后在目标机上执行的开发流程,也就是所谓的交叉编译环境。本文使用的是DebianGNU/Linux的操作系统作为开发平台。首先可以从http://获取Debian最新的稳定版。正确安装好Debian以后,下一步就要建立一套跨平台的交叉编译工具链。

12.2.1开发环境的构建9ppt课件制作一个支持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,大约1~2个小时就编译好了。此时将交叉编译工具链加入PATH环境变量中就可以使用了。10ppt课件对于计算机系统来说,从开机上电到操作系统启动需要一个引导过程。嵌入式Linux系统同样离不开引导程序,这个引导程序就叫作BootLoader。BootLoader是在操作系统运行之前执行的一段小程序。通过这段小程序可以初始化硬件设备、建立内存空间的映射表,从而建立适当的系统软硬件环境,为最终调用操作系统内核做准备。BootLoader的实现非常依赖于具体的硬件。正因如此,几乎不可能为所有的嵌入式系统建立一个通用的BootLoader。12.2.2BootLoader分析移植11ppt课件BootLoader主要分为两种操作模式:启动加载(Bootloading)模式:这种模式也称为自主模式,即BootLoader从目标机上的某个固态存储设备上将操作系统加载到RAM中运行,整个过程并没有用户的介入。这种模式是BootLoader的正常工作模式,因此在嵌入式产品发布的时候,BootLoader显然必须工作在这种模式下。下载(Downloading)模式:在这种模式下,目标机上的BootLoader将通过串口连接或者网络连接等通信手段从主机下载文件。从主机下载的文件通常首先被BootLoader保存到目标机的RAM中,然后再被BootLoader写到目标机上的Flash存储设备中。12ppt课件12.2.3Linux内核移植目录名描述arch体系结构相关的代码,对于每个架构的CPU,arch目录下都有一个对应的子目录block块设备的通用函数crypto常用的加密和散列算法,还有一些压缩和CRC校验算法drivers所有的设备驱动程序,里面每个子目录对应着一类驱动程序表12-1

Linux内核子目录结构13ppt课件fsLinux支持的文件系统的代码,每个子目录对应一种文件系统include内核头文件,包括基本头文件、各种驱动或功能部件的头文件以及各种体系结构的头文件init内核的初始化代码(不是系统的引导代码)ipc进程间通信的代码kernel内核管理的核心代码lib内核用到的一些库函数代码14ppt课件mm内存管理代码net网络支持代码,每个子目录对应网络的一个方面security安全、密钥相关的代码sound音频设备的驱动程序usr用来制作一个压缩的cpio归档文件documentation内核文档scripts用于配置、编译内核的脚本文件15ppt课件内核的源代码可以从http://获取: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。16ppt课件3.修改linux-/arch/arm/plat-s3c24xx/common-smdk.c文件staticstruct

mtd_partition

smdk_default_nand_part[]={ [0]={ .name ="kernel",

.size =0x00200000,

.offset =0,

}, [1]={ .name ="rootfs",

.offset=MTDPART_OFS_APPEND,

.size =MTDPART_SIZ_FULL,

}};17ppt课件下一步,就是进行内核的配置了。这里可以参考S3C2410的开发板来进行配置和调整,内核自带了S3C2410开发板的配置文件。在内核源代码根目录下,执行makes3c2410_defconfig,生成一个基于S3C2410的开发板的默认配置文件。然后再执行makemenuconfig会生成一个基于S3C2410开发板的内核配置菜单。这里需要保留S3C2410/S3C2440CPU的相关配置选项、TCP/IP协议、NANDFlash驱动、USB驱动以及适合的文件系统类型。18ppt课件本文中采用的是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)19ppt课件

Linux遵守文件系统科学分类标准(FilesystemHierarchyStandard,FHS),一个定义许多文件和目录的名字和位置的标准,该标准可以在http:///fhs中找到。FHS也是用来组织Linux和Unix文件的方法,它使得Linux文件系统布局实现了标准化。12.2.4构建根文件系统20ppt课件构建Linux根文件系统,就是按照FHS标准,创建各种目录、工具和配置文件。这里首先通过Busybox来创建可执行文件。

Busybox最初是由BrucePerens在1996年为DebianGNU/Linux安装盘编写的。其目标是在一张软盘上创建一个可引导的GNU/Linux系统,这可以用作安装盘和急救盘。一张软盘可以保存大约1.4~1.7MB的内容,因此这里没有多少空间留给Linux内核以及相关的用户应用程序使用。21ppt课件1、首先解压缩源代码,修改顶层Makefile2、执行makemenuconfig生成一个配置菜单。这里,只需选择默认配置就可以了。3、最后执行make进行编译,执行makeinstall进行安装。这样会在当前目录下生成一个_install目录。

22ppt课件可执行文件创建好以后,接下来需要建立lib目录,并且复制所需要的共享库。可以通过arm-linux-readelf-abusybox|grep‘Shared’命令来查看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/sh23ppt课件2.创建init.d/rcS文件#!/bin/shPATH=/bin:/sbin:/usr/bin:/usr/sbinexportPATHumask022/bin/mount-a/bin/mount-ttmpfs

mdev/dev/bin/mkdir/dev/pts/bin/mount-tdevpts

devpts/dev/pts24ppt课件/bin/mount-tsysfs

sysfs/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/syslogd25ppt课件3.创建fstab文件#device mount-point type options dump fsckorderproc /proc proc defaults 0 0tmpfs /tmp

tmpfs defaults 0 0tmpfs /dev tmpfs defaults 0 026ppt课件4.建立dev目录下必备的设备节点sudo

mknodconsolec51sudo

mknodnullc135.创建passwd文件root:*:0:0:root:/root:/bin/sh27ppt课件6.创建shadow文件root:$1$5qCxLMsr$jJgsPqDW8ZJOS8LE4c5n50:0:0:99999:7::1:7.创建group文件root::0:28ppt课件8.创建profile文件#/etc/profile:system-wide.profilefilefortheBourneshellif["$PS1"];thenif["$(id-u)"-eq0];then PS1='\u@\h:\w\#'

else PS1='\u@\h:\w\$'fifiHOME=/rootexportHOME29ppt课件9.创建resolv.conf文件nameserver10.复制主机的inetd.conf、protocols、mime.types和services文件,其中定义了常见的网络服务的端口和协议。11.最后,创建一些必要的空目录mkdirmntprocrootsystmpvar30ppt课件12.3嵌入式Linux的BOA服务器移植12.3.1CGI简介12.3.2BOA服务器12.3.3CGIC库的移植12.3.4HTML模板的制作12.3.5CGI程序的开发31ppt课件

目前Web技术中生成动态Web页面的方法有CGI和服务器脚本,如JSP、ASP等,但后者需要Web服务器具有这些脚本的运行支持模块。在嵌入式Web服务器中,考虑到资源限制问题,一般都只提供CGI支持,因此在嵌入式设备中Web方式应用实际上就是基于CGI的程序开发。12.3.1CGI简介32ppt课件CGI(CommonGateIntergace)是一段运行在Web服务器上的程序,提供同客户端Html页面的接口。例如,常见的个人主页上大都有一个留言本,留言本的工作方式是先由用户输入一些信息,如名字之类的东西,接着用户按一下“留言”(到目前为止工作都在客户端),浏览器就把这些信息传送到服务器的CGI程序中,于是CGI程序在服务器上按照预定的方法进行处理,在本例中就是把用户提交的信息存入指定的文件中,最后CGI程序给客户端发回一个“留言结束”字样的页面,用户可以在浏览器里看到。33ppt课件

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服务器34ppt课件通过执行./configure–h来查看一些常用的帮助选项:其中比较主要的有:--prefix,指定了安装时的路径。--host指定了生成的平台类型。CC指定了编译器的类型等等。这里,首先通过configure生成一个Makefile文件,如下:./configure–host=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的配置文件。35ppt课件在BOA源码目录下已有一个示例BOA.conf,可以在其基础上进行修改,下面解释一下该文件的含义:监听的端口号,缺省都是80,一般无需修改:Port80bind调用的IP地址,一般注释掉,表明绑定到INADDR_ANY,通配于服务器的所有IP地址:#Listen36ppt课件作为哪个用户运行,即它拥有该用户的权限,一般都是nobody,需要/etc/passwd中有#nobody用户:Usernobody作为哪个用户组运行,即它拥有该用户组的权限,一般都是nogroup,需要在/etc/group文件中有nogroup组:Groupnogroup当服务器发生问题时发送报警的email地址,目前未用,注释掉:ServerAdmin

root@localhost

37ppt课件错误日志文件,如果没有以/开始,则表示从服务器的根路径开始,如果不需要错误日志,则用#/dev/null。在下面设置时,注意一定要建立/var/log/BOA目录:ErrorLog/var/log/BOA/error_log访问日志文件,如果没有以/开始,则表示从服务器的根路径开始,如果不需要错误日志,则用#/dev/null或直接注释掉。在下面设置时,注意一定要建立/var/log/BOA目录:#AccessLog/var/log/BOA/access_log38ppt课件是否使用本地时间。如果没有注释掉,则使用本地时间。注释掉则使用UTC时间:#UseLocaltime是否记录CGI运行信息,如果没有注释掉,则记录,注释掉则不记录:#VerboseCGILogs服务器名字:ServerName

39ppt课件是否启动虚拟主机功能,即设备可以有多个网络接口,每个接口都可以拥有一个虚拟的Web服务器。一般注释掉,即不需要启动:#VirtualHostHTML文档的主目录,如果没有以/开始,则表示从服务器的根路径开始:DocumentRoot/var/www如果收到一个用户请求的话,在用户主目录后再增加的目录名:UserDir

public_html40ppt课件HTML目录索引的文件名,也是没有用户只指明访问目录时返回的文件名:DirectoryIndex

index.html当HTML目录没有索引文件时,用户只指明访问目录时,BOA会调用该程序生成索引文件然后返回给用户,因为该过程比较慢最好不执行,可以注释掉或者给每个HTML目录加上DirectoryIndex指明的文件:#DirectoryMaker/usr/lib/BOA/BOA_indexer41ppt课件如果DirectoryIndex不存在,并且DirectoryMaker被注释,那么就用BOA自带的索引生成程序来生成目录的索引文件并输出到下面目录,该目录必须是BOA能读写:#DirectoryCache/var/spool/BOA/dircache一个连接所允许的HTTP持续作用请求最大数目,注释或设为0都将关闭HTTP持续作用KeepAliveMax100042ppt课件HTTP持续作用中服务器在两次请求之间等待的时间数,以秒为单位,超时将关闭连接:KeepAliveTimeout10指明mime.types文件位置。如果没有以/开始,则表示从服务器的根路径开始。可以注释掉,避免使用mime.types文件,此时需要用AddType在本文件里指明:MimeTypes/etc/mime.types

43ppt课件文件扩展名没有或未知的话,使用的缺省MIME类型:DefaultTypetext/plain提供CGI程序的PATH环境变量值:CGIPath/bin:/usr/bin:/usr/local/bin将文件扩展名和MIME类型关联起来,和mime.types文件作用一样。如果用mime.types,文件,则注释掉,如果不使用mime.types文件,则必须使用:#AddType

application/x-httpd-cgi

cgi44ppt课件指明文档重定向路径:#Redirect/barhttp://elsewhere/feh/bar为路径加上别名:Alias/doc/usr/doc指明CGI脚本的虚拟路径对应的实际路径。一般所有的CGI脚本都要放在实际路径里,用户访问执行时输入站点+虚拟路径+CGI脚本名:ScriptAlias/cgi-bin//var/www/cgi-bin/45ppt课件用户可以根据自己需要,对BOA.conf进行修改,但必须要保证其他的辅助文件和设置必须和BOA.conf里的配置相符,不然BOA就不能正常工作。在上面的例子中,还需要创建日志文件所在目录/var/log/BOA,创建HTML文档的主目录/var/www,将mime.types文件拷贝到/etc目录,创建CGI脚本所在目录/var/www/cgi-bin/。mime.types文件用来指明不同文件扩展名对应的MIME类型,一般可以直接从Linux主机上拷贝一个,大部分也都是在主机的/etc目录下。46ppt课件还要修改一下BOA的启动脚本,以方便控制BOA的运行。修改debian目录下BOA.init文件#!/bin/sh## WrittenbyMiquelvanSmoorenburg<miquels@cistron.nl>.# ModifiedforDebianGNU/Linux# byIanMurdock<imurdock@>.#ModifiedforBOAbyBillAllombert<ballombe@>.###BEGININITINFO#Provides:BOA#Required-Start:$local_fs$remote_fs$network#Required-Stop:$local_fs$remote_fs$network47ppt课件#Default-Start:2345#Default-Stop:016#Short-Description:BOA:lightweightandhighperformancewebserver###ENDINITINFOPATH=/sbin:/bin:/usr/sbin:/usr/binDAEMON=/usr/sbin/BOANAME=BOADESC="HTTPserver"test-x$DAEMON||exit0set-ecase"$1"instart)48ppt课件 echo-n"Starting$DESC:$NAME" start-stop-daemon--start--quiet--exec$DAEMON echo"." ;;stop) echo-n"Stopping$DESC:$NAME" start-stop-daemon--stop--quiet--oknodo--exec$DAEMON echo"." ;;restart) echo-n"Restarting$DESC:$NAME..." start-stop-daemon--stop--signalHUP--quiet--oknodo--exec$DAEMON echo"done.";;

49ppt课件reload) # # Ifthedaemoncanreloaditsconfigfilesonthefly # forexamplebysendingitSIGHUP,doithere. # # Ifthedaemonrespondstochangesinitsconfigfile # directlyanyway,makethisado-nothingentry. # echo-n"Reloading$DESCconfiguration..." start-stop-daemon--stop--signal1--quiet--oknodo--exec$DAEMON echo"done.";;*)

50ppt课件N=/etc/rc.d/init.d/$NAME #echo"Usage:$N{start|stop|restart|reload|force-reload}">&2 echo"Usage:$N{start|stop|restart|reload}">&2 exit1 ;;esacexit051ppt课件第三步就是测试BOA能否正常工作,静态HTML页面能否正常访问,CGI脚本能否正常运行,一般采用NFS方式来进行测试工作,可以将嵌入式目标系统上的/etc目录拷贝到主机的NFS共享目录下,然后将NFS共享目录下的etc目录重新NFSmount为目标系统上的/etc目录。这样就可以在主机上对etc目录下的各种配置文件进行修改而立刻在目标系统上生效。52ppt课件接下来进行CGI脚本的测试,需要一个测试用的CGI脚本。可以写个最简单的HelloWorld程序,示例代码如下:#includevoidmain(){printf("Content-type:text/html\n\n");printf("\n");printf("\n");printf("\n");printf("Hello,world.\n");printf("\n");printf("\n");exit(0);}53ppt课件然后进行交叉编译,将得到的helloworld.cgi拷贝到主机的/nfs/www/cgi-bin目录下。#arm-linux-gcc-ohelloworld.cgi

helloworld.c#cphelloworld.cgi/nfs/www/cgi-bin在浏览器地址栏输入/cgi-bin/helloworld.cgi,可以看到相关页面,表示CGI脚本测试通过。54ppt课件在进行CGI编程之前,先了解HTML的一些知识。CGI可以使用多种编程语言来实现,包括C、C++、Perl等,但在嵌入式设备的开发中,一般都不会采用Perl等解释性语言,因为这种语言还需要有解释执行的支撑模块,会占用存贮空间和内存,最常用的方法当然是用C来编写,但C并不是很适合开发象CGI这种需要大量进行字符串操作的程序,编程比较烦琐,因此,对于一个专业的开发人员来说,首先想到的应该是有没有可复用的库来支持快速高效的开发CGI程序。幸运的是目前就有不少开放源码的支持CGI开发的C库。在此只介绍CGIC,有兴趣的读者可以自己在Internet上搜索其他的C库。12.3.3CGIC库的移植55ppt课件CGIC是一个支持CGI开发的开放源码的标准C库,可以免费使用,只需要在开发的站点和程序文档中有个公开声明即可,表明程序使用了CGIC库,用户也可以购买商业授权而无需公开声明。CGIC能够提供以下功能:1.分析数据,并自动校正一些有缺陷的浏览器发来的数据;2.透明接收用GET或POST方法发来的From数据;3.能接受上传文件;4.能够设置和接收cookies;5.用一致的方式处理From元素里的回车;6.提供字符串、整数、浮点数、单选或多选功能来接收数据;7.提供数字字段的边界检查;8.能够将CGI环境变量转化成C中的非空字符串;9.提供CGI程序的调试手段,能够回放CGI程序执行时的CGI状态;56ppt课件下载后,解压到“/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.a

cgictest.cgicaptureinstall:libcgic.acplibcgic.a/usr/local/libcpcgic.h/usr/local/include57ppt课件@echolibcgic.aisin/usr/local/lib.cgic.hisin/usr/local/include.libcgic.a:cgic.o

cgic.h

rm-flibcgic.a

$(AR)rc

libcgic.a

cgic.o$(RANLIB)libcgic.a

#mingw32andcygwinusers:replace.cgiwith.execgictest.cgi:cgictest.o

libcgic.a

$(CC)$(CFLAGS)cgictest.o-ocgictest.cgi${LIBS}//由gcc改成了:$(CC)$(CFLAGS)capture:capture.o

libcgic.a

$(CC)$(CFLAGS)capture.o-ocapture${LIBS}//由gcc改成了:$(CC)$(CFLAGS)clean:rm-f*.o*.acgictest.cgicapture58ppt课件修改后保存退出,下面编译并优化。编译,会在目录下生成capture的可执行文件和测试用的cgictest.cgi

文件:#make优化:#arm-linux-stripcapture会把capture由原来的100K左右变成现在的29K左右。59ppt课件 Web方式的应用开发一般都会将界面和程序逻辑脱离开来,允许在一定程度下更改界面,如改变界面文本的属性,建立多语言版本等,而无需改动程序逻辑。界面一般由美工来进行制作,而程序员负责具体功能的实现。在HTML中,表单(FORM)是最主要的传递信息的手段,它适用于任何浏览器。表单中有很多元素,包括输入文本框、单选框、多选框、按钮等等,可以提供信息的交互。具体对象说明和语法请参见其他HTML书籍,在这里不作介绍。根据应用需求,美工或其他设计人员将最后的Web页面设计出来,作为程序员进行开发的模板。12.3.4HTML模板的制作60ppt课件HTML模板还需要关注的是输入的检查。根据输入检查越早越好的原则,需要在用户界面上就对用户提交的数据进行检查。目前一般是采用javascript脚本的方式。当用户提交数据时,表单对象的onSubmit

方法就会被调用,在该方法里就可以对用户的输入进行检查。常用的检查有是否必需、最大/小长度、是否字符、是否数字、email地址、IP地址是否正确、是否匹配一个正则表达式等。61ppt课件CGI程序一般逻辑为:1.安全性检查,是否允许运行脚本;2.处理用户提交的数据,根据元素名字/值中的元素名字来区分数据,然后根据应用需求进行数据处理;3.将处理结果填充表单,根据注释标记将对应的数据填充到HTML文本中去,生成最后的页面返回给浏览器。12.3.5CGI程序的开发62ppt课件下面介绍几个有关CGI的源码:/*此程序可以测试web服务上传的字符串信息*/#include<stdio.h>#include<stdlib.h>#include<string.h>#include<ctype.h>voidmain()/*LINUX下必须返回值类型为int,并且相应的返回处应该添加上相*/{

if(getenv("CONTENT-LENGTH")){char*s=getenv("CONTENT-LENGTH");

printf(s);}

printf("Contenttype:text/html\n\n");63ppt课件

printf("<html>\n");

printf("<head><title>这是测试POST方法</title></head>\n");

printf("<body><br>\n");

printf("<h2>这是测试POST方法</h2>\n");

printf(s);

printf("<hr><p>\n");

printf("<a><b>Gobacktooutput.htmlpage</b></a>\n");

printf("</body>\n");

printf("</html>\n");

fflush(stdout);}/*converthexstringtoint*//*主要转换汉字编码的格式*/int

htoi(char*s){64ppt课件char*digits="0123456789ABCDEF";if(islower(s[0]))s[0]=toupper(s[0]);if(islower(s[1]))s[1]=toupper(s[1]);return16*(strchr(digits,s[0])-strchr(digits,'0'))+(strchr(digits,s[1])-strchr(digits,'0'));}voidmain(){

printf("Contenttype:text/plain\n\n");

printf("<html>\n");

printf("<head><title>这是测试POST方法</title></head>\n");

printf("<bodybgcolor=#008080text=#FFFFFF><br>\n");printf("<palign=center><imgborder=0src=http::8080/winter.gifwidth=750height=120></p>");

printf("<palign=center><imgborder=0src=/winter.gifwidth=70065ppt课件height=120></p>");

printf("<hrnoshadecolor=#FF0000>");

printf("<h2>这是测试POST方法</h2>\n");

printf("<hrnoshadecolor=#FF0000>");/************************************************************************//*取出的数值在nValue中*/

inti,n;charc;intnSum=1;/*总共几个变量*/charnStr[1000];/*存放整个上传的数据串,最多1000个*/memset(nStr,0,1000);/*将10个变量清零*/charnCurrentValue[200];/*当前取出的值*/charnValueName[10][50];/*变量名称*/memset(nValueName,0,500);/*将10个变量名称清零*/66ppt课件charnValue[10][100];/*最多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<br>",n);67ppt课件for(i=0;i<n;i++){c=getchar();/*从标准输入取一个字符*/

nStr[i]=c;/*下面主要是对URL编码的解码*/switch(c){case'&':

nSum+=1;/*变量总数*/

nIndex+=1;/*变量索引号*/nPosion=0;/*字符位置清零*/

c='';

iseq=0;/*清除变量开始标志*/break;case'+':/*空格变换*/68ppt课件c='';

if(iseq==1){

nValue[nIndex][nPosion]='';

nPosion++;}break;case'%':/*非数字和字母,例如汉字编码转换*/{chars[3];s[0]=getchar();s[1]=getchar();s[2]=0;c=htoi(s);i+=2;

if(iseq==1)69ppt课件{

nValue[nIndex][nPosion]=c;

nPosion++;}}break;case'=':/*变量开始*/c='=';

iseq=1;

nPosion=0;/*当前操作的变量的第1个字符*/break;default:/*其它字符*/{

if(iseq){

nValue[nIndex][nPosion]=c;70ppt课件

nPosion++;}}break;}

putchar(c);

fflush(stdout);}/***********************************************************************/

nStr[n]='\n';

printf("<br>");

printf("变量个数=%d",nSum);

printf("<br>");

printf("nIndex

数=%d",nIndex);

printf("<br>");71ppt课件

printf("nPosion

数=%d",nPosion);

printf("<br>");

for(i=0;i<nSum;i++){

printf("第%d个上传的值:%s",i+1,&nValue[i][0]);

printf("<br>");}

printf(nStr);/*显示整个POST上传的字符串*/

printf("<hrnoshadecolor=#0000FF>");/***********************************************************************/

printf("<br>");

printf("调用该CGI程序的网页的URL:%s",getenv("HTTP_REFERER"));

printf("<br>");

printf("调用该CGI程序的Web浏览器的机器名和域名:72ppt课件%s",getenv("REMOTE_HOST"));

printf("<br>");

printf("IP

地址和主机名:%s",getenv("REMOTE_ADDR"));

printf("<br>");

printf("服务器的IP或名字:%s",getenv("SERVER_NAME"));

printf("<br>");

printf("主机的端口号:%s",getenv("SERVER_PORT"));printf("<br>");

printf("服务器软件的名字:%s",getenv("SERVER_SOFTWARE"));

printf("<br>");

printf("用户和组名:%s",getenv("REMOTE_USER"));

printf("<br>");

printf("Web

服务器传递数据给CGI程序时所采用的方法%s",getenv("REQUEST_METHOD"));

printf("<br>");73ppt课件

printf("发送给服务器的完整URL请求:%s",getenv("REQUEST_LINE"));

printf("<br>");

printf("该CGI程序的名称:%s",getenv("SCRIPT_NAME"));

printf("<br>");

printf("QUERY-STRING:%s",getenv("QUERY_STRING"));

printf("<br>");/**********************************************************************/

printf("<hrnoshadecolor=#00FF00>");

printf("<a><b>数据上传测试!</b></a>\n");

printf("</body>\n");

printf("</html>\n");

fflush(stdout);}voidGetOnePostChar()74ppt课件{}首页源码<html><head><metahttp-equiv="Content-Language"content="zh-cn"><metahttp-equiv="Content-Type"content="text/html;charset=gb2312"><title>CGI数据上传测试</title></head><bodybackground="bg.jpg"style="background-attachment:fixed"><palign="center"><imgborder="0"src="water.gif"width=95%height="120"></p><hrnoshadecolor="#FF0000"><formmethod="POST"action="cgi/CGITEST.CGI"name="form"><tableborder="4"width="100%"id="tab

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论