其教:哪里可以下载c语言编写CGI的书?

llds_scorpio 2003-01-24 04:41:43
小弟想用C语言编写CGI,不知道哪里可以下载这方面的书籍,或者说这方面介绍比较详细的网站。谢谢
...全文
329 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
allforly 2003-02-15
  • 打赏
  • 举报
回复
--------------------Configuration: sample - Win32 Debug--------------------
Compiling...
sample.c
C:\Inetpub\wwwroot\cgi-bin\sample.c(50) : fatal error C1004: unexpected end of file found
Error executing cl.exe.

sample.exe - 1 error(s), 0 warning(s)

这是怎么回事?
叶子哟 2003-02-11
  • 打赏
  • 举报
回复
7.6 增加交互能力-----Form
Homepage并非只是给人观看的信息页,有时还需要获取用户的反馈信息,并且Web服务器
根据得到的反馈信息还要给用户作出相应的回答。HTML中 的Form结构就是专为提供这种
交互界面而设计的。Form结构也是一张表。它与Table表的区别在于:Table表是给用户看
的,而Form表是让用户填的。因此Form表又有其特殊的组成元素。

7.6.1 Form元素
下面我们就来简要介绍一下Form表中的常用元素:
1.<FORM ACTION= "URL信息" METHOD=数据传送方法> Form表内容 </FORM>
一对<FORM>标记是一个Form表的最外层。Form表不允许嵌套,也就是说一个Form中不可以再
包含其它Form。其中ACTION属性表示用户提交表格时所要启动的相应处理程序。在https中必须
是一个.EXE可执行文件。METHOD属性表示怎样将数据传送给Web服务器,一种是GET方法(
也是缺省方法),它将数据附加在URL信息上传送给Web服务器;另一种是POST方法,它将
数据独立成块地传送给Web服务器。如果传送数据量大的话,还是建议用POST方法,因为多数
Web服务器的GET方法是通过命令行参数来传递数据,而命令行参数的长度是有限的。
2.<INPUT TYPE=输入方式>
单标记<INPUT>代表输入元素,根据TYPE值的不同,又各自有一套特殊的属性。
(1)<INPUT TYPE=TEXT NAME="变量名">
表示单行文本输入框,NAME属性表示此文本框的变量名,它将与用户填入文本行中的数据一起
交给Web服务器。其它可选属性还有SIZE(输入框显示的长度),MAXLENGTH(输入的最多字
符数),VALUE(文本框内的初始值)。
(2)<INPUT TYPE=RADIO NAME="变量名" VALUE="值名">
表示一个单选按钮,NAME属性表示这一组按钮的变量名,VALUE属性是此组按钮中这一按钮值
的名称。可选属性还有CHECKED(表示被初始选中)。
(3)<INPUT TYPE=CHECKBOX NAME="变量名" VALUE="值名">
表示一个复选框,可选属性还有CHECKED。
(4)<INPUT TYPE=SUBMIT>
<INPUT TYPE=RESET>
分别表示发送按钮和初始化按钮。当用户填完表格后,按了SUBMIT按钮就表示要发送数据,按
RESET按钮就表示要清除所填内容,回到初始状态。可选属性还有VALUE(表示按钮的标题内容)。
3.<SELECT NAME=变量名> 各选项 </SELECT>
一对<SELECT>标记表示一个选择框。可选属性还有SIZE(如果SIZE=1或省略此属性,则Web浏
览器将它显示为一个组合框;如SIZE值大于1,则显示为一个列表框,并且列表框中一次显示的
项数为SIZE的属性值),MULTIPLE(表示可以复选)。
4.<OPTION> 选项内容
单标记<OPTION>必须在一对<SELECT>标记中使用,表示具体的选项。可选属性还有SELECTED
(初始选中),VALUE(选项值名,缺省值为"选项内容")。
5.<TEXTAREA NAME="变量名"> 初始值 </TEXTAREA>
一对<TEXTAREA>标记表示一个多行文本输入框,其中"初始值"为显示在文本框中的初始内容。
可选属性还有ROWS(显示几行),COLS(信息几列)。
下面举一个简单的Form例子,其显示效果如图7-19所示。
<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>

7.6.2 数据传送格式
当用户填完表格并按了SUBMIT按钮后,Web浏览器并非将用户所填的数据直接送给Web服务器,
而先要经过一定的编码处理。
Web浏览器总是将数据按照“变量名=变量值”这样的数据对格式进行编码,并且每对数据之间
用一个&符号相连接。其中“变量名”就是Form元素中的NAME属性值;“变量值”则是用户在
输入框中所输入的数据,或者是用户所选择的数据(即RADIO,CHECKBOX,OPTION中
的VALUE值)。
并且Web浏览器将用户数据中的所有空格都替换成"+"号。另外一些特殊字符的表示使用转义
符"%"后面加上该特殊字符的十六进制ASCII码。特殊字符主要包括"="、"+"、"&"、"%"以及多
行文本中的回车,换行符,所有不能直接显示的高位ASCII符等。


图7-19 一个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.

7.6.3 用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数据时,就启动<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程序的基本框架:
#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;
}


--------------------------------------------------------------------
别忘了编码解码哟!!!!
叶子哟 2003-02-06
  • 打赏
  • 举报
回复
实际上,不管用vc或是cb或是标准的C均可以编写的,基本思想你可以搜一下gg,我记得在某个网站上有专门介绍,实际主要是判断过来的是post还是get,用标准输入流获得数据,然后用标准输出流往IE上输出
llds_scorpio 2003-02-06
  • 打赏
  • 举报
回复
windows下的吧。请各位大哥指点迷津。谢谢!
simplewong 2003-01-27
  • 打赏
  • 举报
回复
在网上搜索一下吧
llds_scorpio 2003-01-27
  • 打赏
  • 举报
回复
有没有中文的网址阿?最好是可以下载中文教材。谢谢!!
叶子哟 2003-01-27
  • 打赏
  • 举报
回复
unix还是windows下的,有一些区别,但基本思想一致!不妨搜一下以前的东西
saucer 2003-01-26
  • 打赏
  • 举报
回复
see

Getting Started with CGI Programming in C
http://www.cs.tut.fi/~jkorpela/forms/cgic.html

cgic 2.02: an ANSI C library for CGI Programming
http://www.boutell.com/cgic/#obtain

2,203

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 CGI
社区管理员
  • CGI社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧