嵌入式CGI开发

本文介绍CGI编程的基础知识,包括GET与POST方法的区别,并通过一个简单的加法运算实例演示了如何使用POST方法提交数据,同时提供了plus.cgi和collect.cgi两个CGI程序的源代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CGI开发:CGI处理步骤1、通过Internet把用户的请求送往服务器;2、服务器接受请求并交由CGI处理;3、CGI把处理结果送回服务器;4、服务器将结构传回给用户。

从浏览器发给服务器有两种方法(Method属性):get和post。get方法是把数据打包放在环境变量QUERY_STRING中作为url整体的一部分传递给服务器。post做很多类型get的事情,但它分离传递数据给脚本,程序通过标准输入获得数据,同样的数据可以多次提交。当数据量超过1024时只能使用post来传递,由于get将数据直接放到url,数据的传输就变得不安全了。

下面以简单的加法为例说明Post提交操作

plus.html 
<from action=”http://192.168.75.1/cgi-bin/plus.cgi”>
<label>plusnum1:<input name=”m”size=”5”></label>
<label>plusnum2:<input name=”n”size=”5”></label>
<input type=”submit”  value=”PLUS!”>
</form>
<form action = “http://192.168.75.1/cgi-bin/collect.cgi”>
method=”POST”>
<label for=”data”>Your input </label >
<input id=”data”name = “data”size=”60”maxlength=”80”>
<input type=”submit” value=”Send”>
</form> 

然后在/var/www/cgi-bin目录下建立plus.c文件并编译成plus.cgi

plus.c	
#include<stdio.h>
#include<stdlib.h>
int main () {
	char *data;
	long m, n;
	printf(“%s%c%c\n”,”Content-Type:text/html;charset=iso-8859-1”,13,10);
	printf(“<title>plus result</title>\n”);
	data=getenv(“QUERY_STRING”);	//取得环境变量
	if(data == NULL)
		printf(“<p>ERROR in pass data\n”);
}
else if (sscanf(data , “m=%ld&n=%ld”, &m, &n)	!= 2)
	printf(“<p>Error ! invalid data.”);
else 
	printf(“<p>the product is %ld and %ld is %ld.”, m , n, m+n);
return 0;
}

新建collect.c

#include <stdio.h>
#include <stdlib.h>
#define MAXLEN 80
#define EXTRA 5
/* 4 for field name "data", 1 for "=" */
#define MAXINPUT MAXLEN+EXTRA+2
/* 1 for added line break, 1 for trailing NUL */
#define DATAFILE "../data/data.txt"
 
void unencode(char *src, char *last, char *dest)
{
 for(; src != last; src++, dest++)
   if(*src == '+')
     *dest = ' ';
//遇到+转化为空格
   else if(*src == '%') {
     int code;
     if(sscanf(src+1, "%2x", &code) != 1) code = '?';
     *dest = code;
     src +=2; }    
   else
     *dest = *src;
//非特殊字符直接保存
 *dest = '/n';
 *++dest = '/0';
//最后加上换行和字符串结束符
}
 
int main(void)
{
char *lenstr;
char input[MAXINPUT], data[MAXINPUT];
long len;
printf("%s%c%c/n",
"Content-Type:text/html;charset=iso-8859-1",13,10);
printf("<TITLE>Response</TITLE>/n");
lenstr = getenv("CONTENT_LENGTH");
if(lenstr == NULL || sscanf(lenstr,"%ld",&len)!=1 || len > MAXLEN)
  printf("<P>Error in invocation - wrong FORM probably.");
else {
  FILE *f;
  fgets(input, len+1, stdin);
/*fetts从指定终端输入流读取字符串,原型为:char *fgets(char *s,int n,FILE *stream)从stream读入字符串到s中,当读入n-1个字符或‘\n’时,函数在s的末尾增加一个NULL字符表明串的结束.成功返回指向s的指针,遇到文件结束或出错返回EOF*/
  unencode(input+EXTRA, input+len, data);
  f = fopen(DATAFILE, "a");
  if(f == NULL)
    printf("<P>Sorry, cannot store your data.");
  else
fputs(data, f);
/*将字符串data写入文件f中,fputs函数的功能是向指定的输出流拷贝一个以NULL为结束符的字符串*/,
  fclose(f);
  printf("<P>Thank you! Your contribution has been stored.");
  }
return 0;
}
<p></p><p>gcc collect.c -o <span style="font-family: monospace; white-space: pre; background-color: rgb(240, 240, 240); ">collect</span>.cgi</p><p>cp <span style="font-family: monospace; white-space: pre; background-color: rgb(240, 240, 240); ">collect</span>.cgi /var/www/cgi-bin/</p>

  在浏览器中输入:192.168.75.1/html/plus.html


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值