用c语言写cgi程序(4)---处理请求post get。文本框,下拉列表框。

来源:互联网 发布:java ftp上传附件 编辑:程序博客网 时间:2024/06/10 06:27

<FORM   METHOD=POST   ACTION="/cgi-bin/sample.exe">   
  <P>Your   name   :   <INPUT   NAME="name"   size=30>   
  <P>Sex   :   
  <INPUT   NAME="sex"   TYPE=RADIO   VALUE="mail"   CHECKED>Male   
  <INPUT   NAME="sex"   TYPE=RADIO   VALUE="female">Female   
  <P>What   are   you   like:   
  <INPUT   NAME="flavor"   TYPE=CHECKBOX   VALUE="apple">Apple   
  <INPUT   NAME="flavor"   TYPE=CHECKBOX   VALUE="orange">Orange   
  <INPUT   NAME="flavor"   TYPE=CHECKBOX   VALUE="strawberry">Strawberry   
  <INPUT   NAME="flavor"   TYPE=CHECKBOX   VALUE="peach">Peach   
  <P>How   much   do   you   eat   them   per   week:   
  <SELECT   NAME="weight">   
  <OPTION   VALUE="little">less   than   1kg   
  <OPTION   VALUE="middle"   SELECTED>1kg   to   3kg   
  <OPTION   VALUE="more">more   than   3kg   
  </SELECT>   
  <P>What's   your   opinion   of   eating   fruit:<BR>   
  <TEXTAREA   NAME="opinion"   COLS=40   ROWS=3>I   think   </TEXTAREA><P>   
  <INPUT   TYPE=SUBMIT   VALUE="Send">   <INPUT   TYPE=RESET   VALUE="Clear">   
  </FORM>   
   

 

数据传送格式 当用户填完表格并按了SUBMIT按钮后,Web浏览器并非将用户所填的数据直接送给Web服务器, 而先要经过一定的编码处理。 Web浏览器总是将数据按照“变量名=变量值”这样的数据对格式进行编码,并且每对数据之间 用一个&符号相连接。其中“变量名”就是Form元素中的NAME属性值;“变量值”则是用户在 输入框中所输入的数据,或者是用户所选择的数据(即RADIO,CHECKBOX,OPTION中 的VALUE值)。 并且Web浏览器将用户数据中的所有空格都替换成"+"号。另外一些特殊字符的表示使用转义 符"%"后面加上该特殊字符的十六进制ASCII码。特殊字符主要包括"="、"+"、"&"、"%"以及多 行文本中的回车,换行符,所有不能直接显示的高位ASCII符等。 一个Form的简单例子 例如在上例中用户填入了下述信息(其中/n表示回车换行): name "J&K" sex "male" flavor "apple" flavor "orange" weight "middle" opinion "I think it is necessary that/nman eat fruit everyday." 则Web浏览器发送数据时的字符序列为: name=J%26K&sex=male&flavor=apple&flavor=orange&weight=middle& opinion=I+think+it+is+necessary+that%0D%0Aman+eat+fruit+everyday. 用CGI程序处理得到的数据 当Web浏览器将Form数据经过编码后,就传送给了Web服务器,而Web服务器并非自己处理这些 数据,而是先依靠CGI程序来帮忙处理这些数据,然后Web服务器再把CGI程序产生的处理结果 返回给Web浏览器。CGI(Common Gateway Interface,通用网关接口)是信息服务器(如Web服 务器)与外部应用程序之间的一个接口标准。通常被Web服务器所取到的HTML文件总是事先编 辑好的,固定不变的信息,但若通过实时运行着的CGI程序Web服务器就有可能向Web浏览器 输出动态的信息。 CGI标准用最简单的话来说就是:CGI程序是通过标准输入(stdin)或环境变量来得到服务器的输 入信息,并通过标准输出(stdout)向服务器输出信息。 当Web服务器收到了由Web浏览器传来的Form数据时,就启动

标记中ACTION属性所指 明的CGI程序。如果METHOD属性值是GET,CGI程序就从环境变量QUERY_STRING中获取Form数 据;若METHOD属性值是POST,CGI程序就从标准输入(stdin)中获取Form数据。 CGI程序获取Form数据并经过处理后,还要向Web服务器返回一定的信息(如数据的处理结果等 )。为让Web服务器能正确理解所返回的是何种信息,CGI规定在输出的信息体前加上一个头部 信息,该头部信息由若干行ASCII文本构成,并用一个空行将头部信息与信息体隔开。例如要返 回HTML文档则头部信息为"Content-type: text/html"。 下面给出一个用C语言编写的CGI程序的基本框架:

 

[cpp] view plaincopy
  1. #include   <stdio.h>    
  2.   #include   <stdlib.h>    
  3.   #include   <string.h>    
  4.   char   InputBuffer[4096];    
  5.   int   main(int   argc,   char   *argv[])   {    
  6.   int   ContentLength;   /*数据长度*/    
  7.   int   x;    
  8.   int   i;    
  9.   char   *p;    
  10.   char   *pRequestMethod;     /*   METHOD属性值   */    
  11.           setvbuf(stdin,NULL,_IONBF,0);     /*关闭stdin的缓冲*/    
  12.           printf("Content-type:   text/html/n");     /*从stdout中输出,告诉Web服务器返回的信息类型*/    
  13.   printf("/n");                                           /*插入一个空行,结束头部信息*/    
  14.           /*   从环境变量REQUEST_METHOD中得到METHOD属性值   */    
  15.           pRequestMethod   =   getenv("REQUEST_METHOD");    
  16.           if   (pRequestMethod==NULL)   {    
  17.                   return   0;    
  18.           }    
  19.           if   (_stricmp(pRequestMethod,"POST")==0)   {    
  20.                   p   =   getenv("CONTENT_LENGTH");     /*从环境变量CONTENT_LENGTH中得到数据长度*/    
  21.                   if   (p!=NULL)   {    
  22.                           ContentLength   =   atoi(p);    
  23.                   }   else   {    
  24.                           ContentLength   =   0;    
  25.         }    
  26.                   if   (ContentLength>sizeof(InputBuffer)-1)   {    
  27.                           ContentLength   =   sizeof(InputBuffer)-1;    
  28.         }    
  29.                   i   =   0;    
  30.                   while   (i<ContentLength)   {                         /*从stdin中得到Form数据*/    
  31.                           x   =   fgetc(stdin);    
  32.                           if   (x==EOF)   break;    
  33.                           InputBuffer[i++]   =   x;    
  34.         }    
  35.                   InputBuffer[i]   =   '/0';    
  36.                   ContentLength   =   i;    
  37.                   DecodeAndProcessData();                 /*具体译码和处理数据,该函数代码略*/    
  38.           }   else      
  39.           if   (_stricmp(pRequestMethod,"GET")==0)   {    
  40.                   p   =   getenv("QUERY_STRING");     /*从环境变量QUERY_STRING中得到Form数据*/    
  41.                   if   (p!=NULL)   {    
  42.                           strncpy(InputBuffer,p,sizeof(InputBuffer));    
  43.                           DecodeAndProcessData();                               /*具体译码和处理数据,该函数代码略*/    
  44.         }    
  45.         }    
  46.         printf("<HEAD><TITLE>Submitted   OK</TITLE></HEAD>/n");       /*从stdout中输出返回信息*/    
  47.         printf("<BODY>The   information   you   supplied   has   been   accepted.</BODY>/n");    
  48.         return   0;    
  49.   }

0 0