您的位置 首页 电源

在Linux体系中怎么进行CGI的程序设计,有什么办法

在Linux系统中如何进行CGI的程序设计,有什么方法-随着互联网应用的普及,越来越多的信息化产品需要接入互联网通过Web页面进行远程访问。嵌入式Web系统提供了一种经济、实用的互联网嵌入式接入方案。这里结合一种嵌入式Web Server BOA来介绍嵌入式Linux系统下的CGI程序设计技术。

1、 概述

跟着互联网运用的遍及,越来越多的信息化产品需求接入互联网经过Web页面进行长途拜访。嵌入式Web体系供给了一种经济、有用的互联网嵌入式接入计划。这儿结合一种嵌入式Web Server BOA来介绍嵌入式Linux体系下的CGI程序设计技能。

2、 Web Server BOA的完结与装备

2.1 uClinux下,首要有三个Web Server:HTTPD、THTTPD和BOA。HTTPD是最简略的一个Web Server,它的功用最弱,不支撑认证,不支撑CGI。THTTPD和BOA都支撑认证、CGI等,功用都比较全。BOA是一个单任务的小型HTTP服务器,源代码敞开、功用优异,特别合适运用在嵌入式体系中。现在的uClinux的代码中现已包括BOA的源代码。在uClinux下完结BOA,只需求对BOA做一些装备和修正。以下是装备的进程。

(1)编译BOA到内核

首要,需求把BOA编译到内核,即履行make menuconfig,在运用程序选单中network application项下面挑选boa。该操作需求从头编译内核。

(2)编制装备文件boa.conf

在Linux操作体系下,运用程序的装备都是以装备文件的办法供给的,一般都是放在方针板/etc/目录下或许/etc/config目录下。但boa的装备文件boa.cont一般都旋转在方针板/home/httpd/目录下。

例如,一个典型的boa.conf文件格局如下:

ServerName Samsung-ARM

DocumentRoot/home/httpd

ScriptAlias/cgi-bin/home/httpd/cgi-bin/

ScriptAlias/index.html/home/httpd/index.html

它指定了HTML页面有必要放到/home/httpd目录下,cgi外部扩展程序有必要放到/home/httpd/cgi-bin目录下。

(3)编译烧写内核

从头编译内核后,经过烧写东西烧写内核,就能够在PC上经过IE浏览器拜访开发板上的Web Server。例如,输入开发板的IP地址http://192.168.0.101,即可拜访到自己做的网页index.html了。而且,经过编写CGI外部扩展程序,能够完结动态Web技能,下面将具体介绍。

2.2 具有MMU渠道的Linux下B0A的完结与装备

关于有MMU(内存办理单元)的渠道,如armlinux和ppclinux,能够到网上下载一个干流版别的boa发行包。由于是运转在方针体系,所以要用穿插编译东西编译,即需求修正boa/src/Makefile里边的编译器。例如:

CC=/LinuxPPC/CDK/bin/powerpc-linux-gcc

CPP=/LinuxPPC/CDK/bin/powerpc-linux-g++

然后直接在boa/src目录下履行make,即可生成BOA可履行文件;将其编译入内核,并烧写到存储设备,就能够完结拜访BOA服务器。

3、 CGI程序设计技能

CGI(Common Gateway Interface)是外部运用扩展运用程序与WWW服务器交互的一个规范接口。依照CGI规范编写的外部扩展运用程序能够处理客户端浏览器输入的数据,然后完结客户端与服务器的交互操作。而CGI规范就界说了Web服务器怎么向扩展运用程序发送音讯,在收到扩展运用程序的信息后又怎么进行处理等内容。经过CGI能够供给许多静态的HTML网页无法完结的功用,比方搜索引擎、依据Web的数据库拜访等等。

3.1 作业原理

(1)WWW和CGI的作业原理

HTTP协议是WWW的根底,它依据客户/服务器模型,一个服务器能够为散布在网络中处的客户供给服务;它是建立在TCP/IP协议之上的“无衔接”协议,每次衔接只处理一个恳求。在服务器上,运转产着一个看护进程对端口进行监听,等候来自客户的恳求。当一个恳求到来时,将创立一个子进程为用户的衔接服务。依据恳求的不同,服务器回来HTML文件或许经过CGI调用外部运用程序,回来处理成果。服务器经过CGI与外部程序和脚本之间进行交互,依据客户端在进行恳求时所采纳的办法,服务器会搜集客户所供给的信息,并将该部分信息发送给指定的CGI扩展程序。CGI扩展程序进行信息处理并将成果回来服务器,然后服务器对信息进行剖析,并将成果发送回客户端。

外部CGI程序与WWW服务器进行通讯、传递有关参数和处理成果是经过环境变量、指令行参数和规范输入来进行的。服务器供给了客户端(浏览器)与CGI扩展程序之间的信息交流的通道。CGI的规范输入是服务器的规范输出,而CGI的规范输出是服务器的规范输入。客户的恳求经过服务器的规范输出传送给CGI的规范输入,CGI对信息进行处理后,将成果发送到它的规范输入,然后由服务器将处理成果发送给客户端。

(2)URL编码

客户端浏览器向服务器发送数据选用编码的办法进行。该编码便是CRL编码。编码的首要作业是表单域的姓名和值的转义,具体的做法为:每一对域和值里的空格都会被替换为一个加号(+)字符,不是字母或数字的字符将被替换为它们的十六进制数字办法,格局为%HH。HH是该字符的ASCII十六进制值。

标签将被替换为“%0D%0A”。

信息是按它们在表单里呈现的顺序排列的。数据域的姓名和数据域的值经过等号(=)字符连在一起。各对名/值再经过“&”字符衔接在一起。经过这些编码处理之后,表单信号就整个成为一个接连的字符流,里边包括着将被送往服务器的悉数信息。

由于表单输入信息都是经过编码后传递给脚本程序的,所以CGI扩展程序在运用这些参数之前有必要对它们进行解码。

3.2 CGI外部扩展程序编制

服务器程序能够经过三种途径接纳信息:环境变量、指令行和规范输入。具体运用哪一种办法要由

标签的METHOD特点来决议。

在“METHOD=GET”时,向CGI程序传递表单编码信息的正常做法是经过指令来进行的。大多数表单编码信息都是经过QUERY_STRING的环境变量来传递的。假如“METHOD=POST”,表单信息将经过规范输入来读取。还有一种不运用表单就能够向CGI传送信息的办法,那便是把信息直接追回在URL地址后边,信息和URL之间用问号(?)来分隔。

下面结合Web长途监控ARM芯片的GPIO(通用输入/输出)的运用实例具体介绍。

(1)GET办法

GET办法是对数据的一个恳求,被用于取得静态文档。当运用GET办法时,CGI程序将会从环境变量QUERY_STRING获取数据。为了处理客户端的恳求,CGI有必要对QUERY_STRING中的字符串进行剖析。当需求从服务器获取数据而且不改动服务器上的数据时,应该选用GET办法;可是假如恳求中包括的字符串超越了必定长度,一般是1024字节,那么就只能选用POST办法。GET办法经过附加在URL后边的参数发送恳求信息。这些参数将被放在环境变量QUERY_STRING中传给CGI程序。GET办法的表单格局和CGI解码程序能够参阅POST办法的完结。

(2)POST办法

当浏览器将数据从一个填写的表单传给服务器时一般选用POST办法,而且在发送的数据超越1024字节时也有必要选用POST办法。当运用POST办法时,Web服务器向CGI程序的规范输入STDIN传送数据。发送的数据长度存在环境变量CONTENT_LENGTH中,而且,POST办法的数据格局为:

variable1=value1&variable2=value2&etc

CGI程序有必要查看REQUEST_METHOD环境变量以确认是否选用了POST办法,并决议是否要读取STDIN。POST办法在HTML文档中界说的表单如下:

Operate P0

Operate P1

Operate P2

NAME=“cancel”TYPE=reset VALUE=“RESET”》

它调用的服务器脚本程序是/cgi/bin/cgi_gpio.cgi。CGI扩展程序中FORM表单的解码可参阅如下程序:

/*funcTIon getPOSTvars*/

char **getPOSTvars(){

int i;

int content_length;

char **postvars;

char *posTInput;

char **pairlist;

int paircount=0;

chr *nvpair;

char *eqpos;

posTInput=getenv(“CONTENT_LENGTH”);//获取传送给程序数据的字节数

if(!posTInput)

exit();

if(!content_length=atoi(postinput))) //获取信息长度

exit(1);

if(!(postinput=(char*)malloc(content_length+1)))

exit(1);

if(!fread(postinput,content_length,1,stadin))

exit(1);

postinput[content_length]=‘0’;

for(i=0;postinput[i];i++)

if(postinput[i]==‘+’)

postinput[i]=‘’; //对加易进行处理

pairlist=(char **)malloc(256*sizeof(char **));

paircount=0;

nvpair=strtok(postinput,“&”);//从呈现“&”字符的方位把信息分段,然后对成果顺次处理

while (nvpair){

pairlist[paircount++]=strdup(nvpair);

if(!(paircount%256))

pairlist=(char**)realloc(pairlist,(paircount+256)*sizeof(char**));

nvpair=strtok(NULL,“&”);

}

pairlist[paircount]=0;

postvars=(char**)malloc((paircount*2+1)*sizeof(char **));

for(i=0;i

if(eqpos=strchr(pairlist[i],‘=’)){

*eqpos=‘0’;

unescape_url(postvars[i*2+1]=strdup(eqpos+1));//调用unescape_url函数持续解码

}else{

unescape_url(postvars[i*2+1])=strdup(“”));

}

postvars[paircount*2]=0;

for(i=0;pairlist[i];i++)

free(pairlist[i]);

free(pairlist);

free(postinput);

return postvars;

}

其间,unescape_url函数再调用x2c函数,把(不是字节或数字的)特别字符从其%HH表明办法解码为文本字符。

在Linux体系中怎么进行CGI的程序设计,有什么办法

(3)直接URL加参数传递办法

这是一种不运用表单就能够向CGI传送信息的办法。它把信息直接追加在URL地址后边,信息和URL之间用号号(?)来分隔。例如,关于一个cgi_gpio.cgi的脚本,能够从如下的链接发动:

/*cgi-bin/cgi_gpio.cgi?flag=1 Operate P1

.

.

.

CGI扩展程序中可运用如下代码接纳信息:char *get_input;//用于接纳环境变量

.

.

.

get_input=getenv(“QUERY_STRING”);

if(get_input){

get_input=strdup(get_input);

printf(“QUERY_STRING if %s”,get_input);

}

/*判别flag=x信息*/

if(!strcmp(get_input,“flag=0”)

..//Operate p0

else if(!strcmp(get_input,“flag=1”)

..//Operate P1

else

。..//Operate P2

关于上述三种办法,能够依据不同的运用场合和运用要求进行选取。

结语

嵌入式Web Server体系计划能够广泛运用在许多范畴,如自动化设备的长途监控、嵌入式GSM短音讯 渠道以及长途家庭医疗等。而且,跟着互联网运用范畴的不断深入,嵌入式Internet技能将得到更为广泛的运用和开展。

责任编辑:gt

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/dianyuan/96576.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部