用c语言写cgi程序(4)---处理请求post get。文本框,下拉列表框。
2013-10-31 23:16
671 查看
http://topic.csdn.net/t/20030213/10/1423382.html
<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 plaincopyprint?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char InputBuffer[4096];
int main(int argc,
char *argv[]) {
int ContentLength; /*数据长度*/
int x;
int i;
char *p;
char *pRequestMethod;
/* METHOD属性值 */
setvbuf(stdin,NULL,_IONBF,0);
/*关闭stdin的缓冲*/
printf("Content-type: text/html/n");
/*从stdout中输出,告诉Web服务器返回的信息类型*/
printf("/n");
/*插入一个空行,结束头部信息*/
/* 从环境变量REQUEST_METHOD中得到METHOD属性值 */
pRequestMethod = getenv("REQUEST_METHOD");
if (pRequestMethod==NULL) {
return 0;
}
if (_stricmp(pRequestMethod,"POST")==0) {
p = getenv("CONTENT_LENGTH");
/*从环境变量CONTENT_LENGTH中得到数据长度*/
if (p!=NULL) {
ContentLength = atoi(p);
} else {
ContentLength = 0;
}
if (ContentLength>sizeof(InputBuffer)-1) {
ContentLength =
sizeof(InputBuffer)-1;
}
i = 0;
while (i<ContentLength) {
/*从stdin中得到Form数据*/
x = fgetc(stdin);
if (x==EOF)
break;
InputBuffer[i++] = x;
}
InputBuffer[i] =
'/0';
ContentLength = i;
DecodeAndProcessData();
/*具体译码和处理数据,该函数代码略*/
} else
if (_stricmp(pRequestMethod,"GET")==0) {
p = getenv("QUERY_STRING");
/*从环境变量QUERY_STRING中得到Form数据*/
if (p!=NULL) {
strncpy(InputBuffer,p,sizeof(InputBuffer));
DecodeAndProcessData();
/*具体译码和处理数据,该函数代码略*/
}
}
printf("<HEAD><TITLE>Submitted OK</TITLE></HEAD>/n");
/*从stdout中输出返回信息*/
printf("<BODY>The information you supplied has been accepted.</BODY>/n");
return 0;
}
<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 plaincopyprint?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char InputBuffer[4096];
int main(int argc,
char *argv[]) {
int ContentLength; /*数据长度*/
int x;
int i;
char *p;
char *pRequestMethod;
/* METHOD属性值 */
setvbuf(stdin,NULL,_IONBF,0);
/*关闭stdin的缓冲*/
printf("Content-type: text/html/n");
/*从stdout中输出,告诉Web服务器返回的信息类型*/
printf("/n");
/*插入一个空行,结束头部信息*/
/* 从环境变量REQUEST_METHOD中得到METHOD属性值 */
pRequestMethod = getenv("REQUEST_METHOD");
if (pRequestMethod==NULL) {
return 0;
}
if (_stricmp(pRequestMethod,"POST")==0) {
p = getenv("CONTENT_LENGTH");
/*从环境变量CONTENT_LENGTH中得到数据长度*/
if (p!=NULL) {
ContentLength = atoi(p);
} else {
ContentLength = 0;
}
if (ContentLength>sizeof(InputBuffer)-1) {
ContentLength =
sizeof(InputBuffer)-1;
}
i = 0;
while (i<ContentLength) {
/*从stdin中得到Form数据*/
x = fgetc(stdin);
if (x==EOF)
break;
InputBuffer[i++] = x;
}
InputBuffer[i] =
'/0';
ContentLength = i;
DecodeAndProcessData();
/*具体译码和处理数据,该函数代码略*/
} else
if (_stricmp(pRequestMethod,"GET")==0) {
p = getenv("QUERY_STRING");
/*从环境变量QUERY_STRING中得到Form数据*/
if (p!=NULL) {
strncpy(InputBuffer,p,sizeof(InputBuffer));
DecodeAndProcessData();
/*具体译码和处理数据,该函数代码略*/
}
}
printf("<HEAD><TITLE>Submitted OK</TITLE></HEAD>/n");
/*从stdout中输出返回信息*/
printf("<BODY>The information you supplied has been accepted.</BODY>/n");
return 0;
}
相关文章推荐
- 警惕C语言中自由的代价
- 推荐五星级C语言学习网站
- c++虚函数
- c++ 虚函数
- C++第二坑:命名空间没有指定的错误
- 【C语言】宏定义的一些所见所闻和心得
- [转]C/C++浮点数在内存中的存储方式
- C语言内存分配策略
- C语言for循环
- 十六、Win32 DLL的编写方法
- C++中关于文字编码的问题
- 孙鑫VC++深入详解之第一个简单win32窗体程序
- C语言while和do...while
- C语言获取系统当前时间
- [C++_Windows]Git for windows环境搭建
- Sizeof与Strlen的区别与联系
- C语言字符串反转函数
- c语言的面试题
- C++出现debug assertion failed
- 新浪面试题:只允许使用++操作符实现加减乘除运算(c语言版)