c语言开发cgi基础

合集下载

CGI编程完全手册(个人学习笔记)

CGI编程完全手册(个人学习笔记)

CGI一.基本原理CGI:通用网关接口(Common Gateway Interface)是一个Web服务器主机提供信息服务的标准接口。

通过CGI接口,Web服务器就能够获取客户端提交的信息,转交给服务器端的CGI程序进行处理,最后返回结果给客户端。

组成CGI通信系统的是两部分:一部分是html页面,就是在用户端浏览器上显示的页面。

另一部分则是运行在服务器上的Cgi程序。

它们之间的通讯方式如下图:服务器和客户端之间的通信,是客户端的浏览器和服务器端的http服务器之间的HTTP 通信,我们只需要知道浏览器请求执行服务器上哪个CGI程序就可以了,其他不必深究细节,因为这些过程不需要程序员去操作。

服务器和CGI程序之间的通讯才是我们关注的。

一般情况下,服务器和CGI程序之间是通过标准输入输出来进行数据传递的,而这个过程需要环境变量的协作方可实现。

1.服务器将URL指向一个应用程序2.服务器为应用程序执行做准备3.应用程序执行,读取标准输入和有关环境变量4.应用程序进行标准输出对于Windows系统而言,还可以通过profile文件进行数据传输(如ini文件),但在这里不做研究。

环境变量在CGI中有着重要的地位!每个CGI程序只能处理一个用户请求,所以在激活一个CGI程序进程时也创建了属于该进程的环境变量。

二.环境变量对于CGI程序来说,它继承了系统的环境变量。

CGI环境变量在CGI程序启动时初始化,在结束时销毁。

当一个CGI程序不是被HTTP服务器调用时,它的环境变量几乎是系统环境变量的复制。

当这个CGI程序被HTTP服务器调用时,它的环境变量就会多了以下关于HTTP服务器、客户端、CGI传输过程等项目。

并且经过了URL编码。

ACCEPT:客户机所支持的MIME类型清单,内容如:”image/gif,image/jpeg”REQUEST_METHOD:它的值一般包括两种:POST和GET,但我们写CGI程序时,最后还要考虑其他的情况。

用c语言写cgi程序

用c语言写cgi程序

用c语言写cgi程序(1)代码用这个:/question/28759329.html再贴一下:view plaincopy to clipboardprint?1. #include <stdio.h>2. #include <stdlib.h>3. i nt main(void)4. {5. c har *data;6. l ong m,n;7. p rintf("%s%c%c ","Content-Type:text/html;charset=gb2312",13,10);8. p rintf("<TITLE>乘法结果< /TITLE > ");9. p rintf("<H3>乘法结果< /H3 > ");10. data = getenv("QUERY_STRING");11. if(data == NULL)12. printf("<P>错误!数据没有被输入或者数据传输有问题");13. else if(sscanf(data,"m=%ld&n=%ld",&m,&n)!=2)14. printf("<P>错误!输入数据非法。

表单中输入的必须是数字。

");15. else16. printf("<P>%ld和%ld的成绩是:%ld。

",m,n,m*n);17. return 0;18. }19. 编译运行出.exe的文件。

是否要把后缀名改为.cgi?20. 此程序的表单如下:21. <FORM ACTION="/cgi-bin/mult.cgi">22. <P>请在下面填入乘数和被乘数,按下确定后可以看到结果。

CGI介绍

CGI介绍

cgic: 为C语言编写CGI的C函数库2010-09-14 13:43:18分类:C/C++CGIC介绍一般的Unix系统都支持ANSIC,增加相应的库函数(和相应的h文件)就可以实现CGI。

在此我向大家推荐一个用于CGI编程的ANSIC库:cgic。

cgic是用来生成基于CGI的WWW应用程序的C语言函数库,它有以下功能:*对数据进行语法分析*接收以GET和PSOT两种方式发送的数据*把FORM中的不同域连接成连续的串*为检索FORM数据而提供字符串,整数,浮点以及单项和多项选择功能*为数字字段提供边界检测*把CGI环境变量加载到非空的C串中*为调试而捕捉CGI状态*提供相对安全的系统调用功能用一般ANSI C或C++编译器就可以编译cgic程序,不过与通常C程序不同的是,用cgic写的源码其主函数是cgiMain(),而不是通常的main()。

cgic的函数库会自动把cgiMain连接到相应的main()上去。

--------------------------------------------------------------------------------写CGIC程序Note: 所有的cgic应用程序必须连接cgic.c.用cgimain()替代main() 必须包含: #include"cgic.h."基本结构cgictest.c:int cgiMain() {#if DEBUGcgiReadEnvironment("/path/to/capcgi.dat");#endifcgiHeaderContentType("text/html");fprintf(cgiOut, "<HTML><HEAD>\n");fprintf(cgiOut, "<TITLE>cgic test</TITLE></HEAD>\n"):fprintf(cgiOut, "<BODY><H1>cgic test</H1>\n");Name();Address();Hungry();Temperature();Frogs();Color();Flavors();NonExButtons();RadioButtons();fprintf(cgiOut, "</BODY></HTML>\n");return 0;}capture输出标头cgiHeaderContentType()在输出文挡之前简要说明MIME内型,如 "text/html"。

用c语言写cgi程序(3)---实现文件上传

用c语言写cgi程序(3)---实现文件上传

敬告:其实当前的cgic版本已经有上传的功能了,可以看看自带的test文件用C语言编写cgi程序的话,多半会用到CGIC。

这是个非常流行的库,遇到文件上传之类的应用更是离不开它。

官方页面及下载地址为:/cgic/#obtain不少网站都有文件上传的功能,本文展示如何用CGIC库编写文件上传的服务端程序,最后给出一段简单的HTML代码,供大家测试使用。

下载: upload.c[cpp:nogutter]view plaincopyprint?#include<stdio.h>#include<string.h>#include<unistd.h>#include<fcntl.h>#include<sys/stat.h>#include"cgic.h"#define BufferLen 1024int cgiMain(void){cgiFilePtr file;int targetFile;mode_t mode;char name[128];char fileNameOnServer[64];char contentType[1024];char buffer[BufferLen];char *tmpStr=NULL;int size;int got,t;cgiHeaderContentType("text/html");//取得html页面中file元素的值,应该是文件在客户机上的路径名if (cgiFormFileName("file", name, sizeof(name)) !=cgiFormSuccess) {fprintf(stderr,"could not retrieve filename/n");goto FAIL;}cgiFormFileSize("file", &size);//取得文件类型,不过本例中并未使用cgiFormFileContentType("file", contentType, sizeof(contentType));//目前文件存在于系统临时文件夹中,通常为/tmp,通过该命令打开临时文件。

cgi标准

cgi标准

cgi标准CGI(通用网关接口,Common Gateway Interface)是一种用于在Web服务器与外部程序之间传递信息的标准协议。

它允许Web服务器调用外部程序处理客户端请求,将动态生成的内容发送回客户端浏览器。

CGI 标准定义了Web服务器和外部程序之间的通信规范,为不同类型的Web服务器和编程语言提供了一致的接口。

1. 起源和背景CGI的概念最早在1993年由NCSA(National Center for Supercomputing Applications)提出,它是一种连接Web服务器与应用程序的接口标准。

在早期Web发展阶段,静态HTML页面已经无法满足用户对交互性和动态内容的需求,因此需要一种机制来实现动态生成的Web页面。

2. CGI的工作原理CGI的工作原理相对简单,它建立在HTTP协议之上。

当Web服务器接收到一个带有CGI请求的HTTP请求时,它会调用相应的CGI程序来处理该请求。

CGI程序负责生成动态内容,并将结果返回给Web服务器,最终由Web服务器发送给客户端。

要实现CGI,需要以下步骤:•HTTP请求接收:当Web服务器接收到一个HTTP请求时,它会检查请求的URL是否匹配CGI脚本的路径。

•环境变量设置:Web服务器会将请求的信息(如请求方法、URL、查询参数等)以环境变量的形式传递给CGI程序。

CGI程序可以通过读取这些环境变量来获取请求的详细信息。

•标准输入输出:CGI程序通过标准输入(stdin)获取来自Web服务器的输入,通过标准输出(stdout)将生成的内容返回给Web服务器。

错误信息通常通过标准错误(stderr)输出。

•HTTP响应构建:CGI程序生成动态内容后,将其发送到标准输出。

Web服务器接收到输出后,将其包装成HTTP响应,并将响应发送回客户端。

3. CGI标准的关键特性3.1 文件位置CGI程序通常存储在特定的目录中,例如cgi-bin。

CGI

CGI

CGI程序CGI全称Common Gateway Interface (共同编程接口),是一种编程接口,不论什么语言,只要按照该接口的标准编写出来的程序,即可叫做CGI 程序。

CGI 程序的输入/输出是使用编程语言的标准输入/标准输出。

1、CGI 程序的通信方式当有数据从浏览器传到Web 服务器后,该服务器会根据传送的类型(基本有二类:GET/POST),将这些接收到的数据传入QUERY_STRING 或变量中,CGI 程序可以通过标准输入,在程序中接收这些数据。

当要向浏览器发送信息时,只要向Web 服务器发送特定的文件头信息,即可通过标准输出将信息发往Web 服务器,Web 服务器处理完这些由CGI 程序发来的信息后就会将这些信息发送给浏览器。

这样就是CGI 程序的通信方式了。

2、接收数据用GET 方式接收到的数据保存在Web 服务器的QUERY_STRING 变量里,而通过POST 方式接收到的数据是保存在这个Web 服务器变量里。

它们的唯一区别就是:以GET 方式接收的数据是有长度限制,而用POST 方式接收的数据是没有长度限制的。

并且,以GET 方式发送数据,可以通过URL 的形式来发送,但POST方式发送的数据必须要通过Form 才到发送。

3.标准输出CGI程序通过标准输出(stdout)将输出信息传送给Web服务器。

传送给Web服务器的信息可以用各种格式,通常是以纯文本或者HTML文本的形式,这样我们就可以在命令行状态调试CGI程序,并且得到它们的输出Cgi简单程序分析:#include <stdio.h>#include <stddef.h>#include <sys/stat.h>#include <dirent.h>#include <stdlib.h>#include <iconv.h>#include <string.h>#include <unistd.h>#include <sys/types.h>#include <sys/wait.h>int main(void){char name[50]="\0";DIR *dp;struct dirent *ep;struct stat st;printf("%s%c%c\n","Content-Type:text/html;charset=utf-8",13,10); //这一行告诉浏览器如何处理接受到的内容printf("<TITLE>历史照片</TITLE>\n");//HTML标题printf("<table align=\"center\" border=\"1\" bordercolor=\"#000000\"cellspacing=\"4\">");//表示照片居中放置,边框为1,取默认颜色为背景颜色,间距为4dp=opendir("../../picture/");//打开存储图片的目录chdir("../../picture/");//进入存储图片的目录if(dp!=NULL)//判断目录是否为空{while(ep=readdir(dp))//读取目录不为空{if(ep->d_name[0]!='.')//判断文件是否是隐藏文件{{{printf("<tr><td>");//tr表示换行,td表示表格,与</tr>,</td>成对出现printf("%s ",ep->d_name);//打印文件名称printf("</td>");printf("<td>");printf("<img align=\"middle\" src=\"../../picture/%s\"width=\"640\" height=\"480\" />",ep->d_name);//网页文件居中放置,大小640*480及文件名称printf("</td></tr>");//结束}}}}}printf("</table>");//整个表格结束标志printf("<meta http-equiv=\"refresh\" content=\"5\">");//5秒后自动跳回主界面}由于C语言在平台无关性上表现不错(几乎在任何的系统平台下都有其相应编译器),因此,C是CGI编程的首选语言之一。

C语言Web开发入门前后端交互和数据库连接

C语言Web开发入门前后端交互和数据库连接在现代互联网时代,Web开发成为了热门的技术方向之一。

C语言作为一门广泛应用的编程语言,也可以用于Web开发。

本文将介绍C 语言Web开发中的前后端交互和数据库连接的基本知识。

一、前后端交互前后端交互是Web开发中非常重要的一环,它决定了用户与网站之间的信息传递和数据交换。

在C语言中,我们可以利用CGI(通用网关接口)来实现前后端交互。

CGI是一种标准化的接口协议,它定义了Web服务器与后端程序之间的通信规范。

通过CGI,我们可以在C语言中编写后端程序,接收来自前端页面的请求,并作出响应。

以下是一个简单的C语言实例:```c#include<stdio.h>#include<stdlib.h>int main(){printf("Content-type: text/html\n\n");printf("<html><body>");printf("<h1>Hello, CGI!</h1>");printf("</body></html>");return 0;}```上述代码通过`printf`函数输出HTML文本,实现了一个简单的CGI程序。

通过在Web服务器上配置CGI的映射规则,可以将该程序与前端页面进行交互。

二、数据库连接在Web开发中,数据库的应用非常普遍,它可以用于存储和管理网站的各种数据。

在C语言中,我们可以使用ODBC(开放数据库连接)来实现与数据库的连接。

ODBC是一种面向数据库的接口规范,它提供了一套标准的函数库,用于C语言程序与数据库之间的交互。

在使用ODBC之前,我们需要先安装相应的ODBC驱动程序,并进行相应的配置。

以下是一个简单连接MySQL数据库的C语言示例:```c#include<stdio.h>#include<sql.h>#include<sqlext.h>int main(){SQLHENV henv;SQLHDBC hdbc;SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER);SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);SQLDriverConnect(hdbc, NULL,"DSN=test;UID=root;PWD=123456", SQL_NTS, NULL, 0, NULL,SQL_DRIVER_COMPLETE);// 执行SQL查询或更新操作等SQLDisconnect(hdbc);SQLFreeHandle(SQL_HANDLE_DBC, hdbc);SQLFreeHandle(SQL_HANDLE_ENV, henv);return 0;}```上述代码使用了ODBC函数库来实现与MySQL数据库的连接。

cgi语言_CGI之C语言篇

cgi语言:CGI之C语言篇疯狂代码 / ĵ:http://CDevelopment/Article14437.html为什么要进行CGI编程? 在HTML中当客户填写了表单并按下了发送(submit)按钮后表单内容被发送到了服务器端般这时就需要有个服务器端脚本来对表单内容进行些处理或者是把它们保存起来或者是按内容进行些查询或者是些别什么没有了CGIWEB世界就完全失去了它交互性所有信息都变成单向了而不能够有任何反馈 有人认为可以用javascript来代替CGI这其实是个概念上javascript只能够在客户浏览器中运行而CGI却是工作在服务器上他们所做工作有些交集比如表单数据验证类但是javascript是绝对无法取代CGI但可以这样说如果项工作即能够用javascript来做又可以用CGI来做那么绝对要使用javascript在执行速度上javascript比CGI有着先天优势只有那些在客户端解决不了问题比如和某个远程数据库交互这时就应该使用CGI了 简单说来CGI是用来沟通HTML表单和服务器端接口(erface)说它是接口也就是说CGI并不是种语言而是可以被其他语言所应用个规范标准集理论上讲你可以用任何语言来编写CGI只要在编程时候符合CGI规范标准所定义些东西就可以了由于C语言在平台无关性上表现不错(几乎在任何系统平台下都有其相应编译器)而且对大多数员而言都算得上很熟悉(不像Perl)因此C是CGI编程首选语言的这儿我们介绍就是如何使用C来编写CGI 作为CGI编程最为简单例子就是进行表单处理因而在这篇文章中我们主要介绍就是如何用C来编写CGI来进行表但处理 GET表单处理 对于那些使用了属性“METHOD=GET”表单(或者没有METHOD属性这时候GET是其缺省值)CGI定义为:当表单被发送到服务器断后表单中数据被保存在服务器上个叫做QUERY_STRING环境变量中这种表单处理相对简单只要读取环境变量就可以了这点对区别语言有区别做法在C语言中你可以用库getenv(定义在标准库stdlib中)来把环境变量值作为个串来存取你可以在取得了串中数据后运用些小窍门技巧进行类型转换这都是比较简单了在CGI中标准输出(output)(比如在C中stdout文件流)也是经过重定义了它并没有在服务器上产生任何输出内容而是被重定向到客户浏览器这样如果编写个CCGI时候把个HTML文档输出到它stdout上这个HTML文档会被在客户端浏览器中显示出来这也是CGI个基本原理 我们来看看具体实现下面是段HTML表单:<formACTION="/cgi-bin/mult.cgi"><P>请在下面填入乘数和被乘数按下确定后可以看到结果<INPUTNAME="m"SIZE="5"><INPUTNAME="n"SIZE="5"><BR><INPUTTYPE="SUBMIT"values="确定"></form> 我们要实现功能很简单就是把表单中输入数值乘起来然后输出结果其实这个功能完全可以用javascript来实现但为了让尽量简单易懂我还是选择了这个小小乘法来作为举例 下面就是处理这个表单CGI对应于form标签中ACTION属性值#<stdio.h>#<stdlib.h>(void){char*data;longm,n;prf("%s%c%c","Content-Type:text/html;char=gb2312",13,10);prf("<TITLE>乘法结果</TITLE>");prf("<H3>乘法结果</H3>");data=getenv("QUERY_STRING");(dataNULL)prf("<P>!数据没有被输入或者数据传输有问题");(sscanf(data,"m=%ld&n=%ld",&m,&n)!=2)prf("<P>!输入数据非法表单中输入必须是数字");prf("<P>%ld和%ld成绩是:%ld",m,n,m*n);0;} 具体C语法就不多讲了我们来看看它作为CGI所特殊地方 前面已经提到标准输出内容就是要被显示在浏览器中内容第行输出内容是必须也是个CGI所特有:prf("%s%c%c","Content-Type:text/html",13,10)这个输出是作为HTML文件头CGI不仅可以像浏览器输出HTML文本而且可以输出图像声音的类东西这行告诉浏览器如何处理接受到内容在Content-Type定义后面跟有两行空行这也是不可缺少所有CGI头部输出都是相近因而可以为其定义个来节省编程时间这是CGI编程常用个窍门技巧 在后面了用了库getevn来得到QUERY_STRING内容然后使用sscanf把每个参数值取出来要注意是sscanf使用方法其他就没有什么了和般C没有区别 把编译后改名为mult.cgi放在/cgi-bin/目录下面就可以被表单了这样个处理GET方式表单CGI就大功告成了 POST表单处理 下面我们来考虑另外种表单传送思路方法:POST假设我们要实现任务是这样:把表单中客户输入段文本内容添加到服务器上个文本文件后面这可以看作是个留言版雏形显然这个工作是无法用javascript这种客户端脚本来实现也算得上真正意义上CGI了 看起来这个问题和上面讲内容很相近仅仅是用区别表单和区别脚本()而已但实际上这中间是有些区别在上面例子中GET处理思路方法可以看作是“纯查询(purequery)”类型也就是说它和状态无关同样数据可以被提交任意次数而不会引起任何问题(除了服务器些小小开销)但是现在任务就区别了至少它要改变个文件内容因而可以说它是和状态有关这也算是POST和GET区别的而且GET对于表单长度是有限制而POST则不然这也是在这个任务中选用POST思路方法主要原因但相对对GET处理速度就要比POST快些 在CGI定义中对于POST类型表单其内容被送到CGI标准输入(在C语言中是stdin)而被传送长度被放在环境变量CONTENT_LENGTH中因而我们要做就是在标准输入中读入CONTENT_LENGTH长度串从标准输出读入数据听起来似乎要比从环境变量中读数据来要容易些其实则不然,有些细节地方要注意这在下面中可以看到特别要注意点就是:CGI和般有所区别般在读完了个文件流内容的后会得到个EOF标志但在CGI表单处理过程中EOF是永远不会出现所以千万不要读多于CONTENT_LENGTH长度否这会有什么后果谁也不知道(CGI规范标准中没有定义般根据服务器区别而有区别得处理思路方法) 我们来看看到底如何从POST表单收集数据到CGI下面給出了個比较简单C源代碼:#<stdio.h>#<stdlib.h>#MAXLEN80#EXTRA5/*4个字节留给字段名字"data",1个字节留给"="*/ #MAXINPUTMAXLEN+EXTRA+2/*1个字节留给换行符还有个留给后面NULL*/#DATAFILE"../data/data.txt"/*要被添加数据文件*/voidunencode(char*src,char*last,char*dest) {for(;src!=last;src,dest)(*src"+")*dest="";(*src"%"){code;(sscanf(src+1,"%2x",&code)!=1)code="?";*dest=code;src2;}*dest=*src;*dest="";*dest="";}(void){char*lenstr;charinput[MAXINPUT],data[MAXINPUT];longlen;prf("%s%c%c","Content-Type:text/html;char=gb2312",13,10);prf("<TITLE>Response</TITLE>");lenstr=getenv("CONTENT_LENGTH");(lenstrNULL||sscanf(lenstr,"%ld",&len)!=1||len>MAXLEN) prf("<P>表单提交");{FILE*f;fgets(input,len+1,stdin);unencode(input+EXTRA,input+len,data);f=fopen(DATAFILE,"a");(fNULL)prf("<P>对不起意外不能够保存你数据");fputs(data,f);fclose(f);prf("<P>非常感谢您数据已经被保存<BR>%s",data);}0;} 从本质上来看先从CONTENT_LENGTH环境变量中得到数据字长然后读取相应长度串数据内容在传输过程中是经过了编码所以必须进行相应解码编码规则很简单主要有这几条: 1.表单中每个每个字段用字段名后跟等号再接上上这个字段值来表示每个字段的间内容用&连结; 2.所有空格符号用加号代替所以在编码码段中出现空格是非法; 3.特殊比如标点符号和些有特定意义如“+”用百分号后跟其对应ACSII码值来表示 例如:如果用户输入是: Hellothere! 那么数据传送到服务器时候经过编码就变成了data=Hello+there%21上面unencode()就是用来把编码后数据进行解码在解码完成后数据被添加到data.txt文件尾部并在浏览其中回显出来 把文件编译完成后把它改名为collect.cgi后放在CGI目录中就可以被表单了下面给出了其相应表单:<formACTION="/cgi-bin/collect.cgi"METHOD="POST"><P>请输入您留言(最多80个):<BR><INPUTNAME="data"SIZE="60"MAXLENGTH="80"><BR><INPUTTYPE="SUBMIT"values="确定"></form> 事实上这个只能作为例子是不能够正式使用它漏掉了很关键个问题:当有多个用户同时像文件写入数据是肯定会有发生而对于个这样而言文件被同时写入几率是很大因此在比较正式留言版中都需要做些更多考虑比如加入个信号量或者是借助于个钥匙文件等那只是编程窍门技巧问题在这儿就不多说了 最后我们来写个浏览data.txt文件CGI这只需要把内容输出到stdout就可以了: #<stdio.h> #<stdlib.h> #DATAFILE"../data/data.txt" (void) { FILE*f=fopen(DATAFILE,"r"); ch; (fNULL){ prf("%s%c%c", "Content-Type:text/html;char=gb2312",13,10); prf("<TITLE></TITLE>"); prf("<P><EM>意外无法打开文件</EM>");} { prf("%s%c%c", "Content-Type:text/plain",13,10); while((ch=getc(f))!=EOF) putchar(ch); fclose(f);} 0; } 这个唯要注意是:它并没有把data.txt包装成HTML格式后再输出而是直接作为简单文本(plaext)输出这只要在输出头部用text/plain类型代替text/html就可以了浏览器会根据Content-Type类型自动选择相应处理思路方法 要触发这个也很简单没有数据要输入所以只需个按钮就可以搞定了: <formACTION="/cgi-bin/viewdata.cgi"> <P><INPUTTYPE="SUBMIT"values="察看"> </form> 到这儿些基本用C编写CGI原理就将完了当然就凭讲这些内容还很难编写出个好CGI这需要进步学习CGI规范标准定义以及些其他CGI编程特有窍门技巧 这篇文章目也就是要你了解下CGI编程概念事实上现在些主流服务器端脚本编程语言如ASPPHPJSP等都基本上具备了CGI编程大部分功能但他们在使用上确实是比无论用什么语言进行CGI编程都要容易多所以在进行服务器端编程时候般都会首先考虑使用这些脚本编程语言只有当他们也解决不了比如要进行些更为底层编程时候才会用到CGI 2009-2-12 5:06:00疯狂代码 /。

CGI资料整理

一、Web文档的三种基本形式1、静态文档:是一个存储于Web服务器的文件,静态文档由作者在写作时决定文档内容,它的内容不会变化。

是一种排版语言,主要优点,是简单、可靠、性能好;主要缺点,是灵活性差,当信息变化时,必须重新设计文档。

2、动态文档:它在浏览器访问Web服务器时创建,没有预先定义的格式。

内容总是变化的,每次访问都要创建新文档。

可以用来显示天气预报、股巿行情等时效性很强的信息。

主要缺点创建费用较高、访问的时间较长、且浏览器取得一个复制的文档后不会再改变。

3、活动文档:它不完全由服务器产生,一个活动文档包括一个计算和显示的程序。

只要用户程序保持运行,该文档可以不断地变化。

活动文档本身不包含运行所需要的软件,大部分支持软件在浏览器上。

主要缺点,是创建和运行这类文档费用高,安全性差。

二、静态文档与动态文档的实现html是编制网页的基本语言,但它只能用于静态的网页。

当今的web已经不再是早期的静态信息发布平台,它已被赋以更丰富的内涵。

现在,我们不仅需要web提供所需的信息,还需要提供可个性化搜索的功能,可以收发email,可以进行网上销售,可以从事电子商务等等。

为实现以上功能必须使用更新的网络编程技术制作动态网页。

所谓动态,指的是,按照访问者的不同需要,对访问者输入的信息作出不同的响应,提供响应的信息。

动态网页技术的原理是:使用不同技术编写的动态页面保存在web服务器内,当客户端用户向web服务器发出访问动态页面的请求时,web服务器将根据用户所访问页面的后缀名确定该页面所使用的网络编程技术,然后把该页面提交给相应的解释引擎;解释引擎扫描整个页面找到特定的定界符,并执行位于定界符内的脚本代码以实现不同的功能,如访问数据库,发送电子邮件,执行算术或逻辑运算等,最后把执行结果返回web服务器;最终,web服务器把解释引擎的执行结果连同页面上的html内容以及各种客户端脚本一同传送到客户端。

虽然,客户端用户所接收到的页面与传统页面并没有任何区别,但是,实际上页面内容已经经过了服务端处理,完成了动态的个性化设置。

Windows操作平台下CGI的实现

⼀、CGI概述1.CGI概念 CGI即通⽤⽹关接⼝(Common Gateway Interface),它是⼀个WWW服务器主机对外服务的标准接⼝。

⼀般来说,⼀个CGI接⼝的功能就是在超⽂本⽂件和服务器主机应⽤程序间传递信息。

 2.CGI程序语⾔ 事实上,任何⼀种程序语⾔,只要能在服务器主机上利⽤CGI接⼝来编写应⽤程序,都可以叫作CGI程序语⾔。

⽬前最为流⾏的CGI程序语⾔有四种:C、Shell、Perl和Visual Basic,其它⼀些语⾔也有许多⼈在⽤,如TCL、Frotran及AppleScript等。

下⽂我们将介绍⽤C语⾔编写CGI的⽅法。

 3.CGI程序的执⾏ CGI程序⼀般是个可执⾏程序。

编译好的CGI程序⼀般要集中放在⼀个⽬录下。

具体存放的位置随操作系统的不同⽽不同,例如UNIX系统下是放在cgi-bin⼦⽬录下,⽽在Windows操作下(注意,这⾥不包括NT4.0)以Webstar或Website作WWW服务器,CGI程序都放在cgi-win下。

CGI程序的执⾏⼀般有两种调⽤⽅式:⼀种是通过URL直接调⽤,如:/cgi-win/cgi.exe,在Netscape的URL栏⾥直接写⼊上述描述就可以调⽤该程序:另⼀种⽅式,也是主要的⽅式是通过交互式主页⾥的FORM栏调⽤,通常都是⽤户在填完⼀张表后按确认按钮启动CGI程序。

 4.CGI⼯作的主要流程 CGI⼯作的主要流程是:1.通过HTML获取⽤户输⼊的信息;2.将⽤户输⼊的信息传给服务器主机应⽤程序(如数据库查询);3.将服务器处理结果通过HTML⽂件返回给⽤户。

⼆、Windows平台下CGI的⼯作原理 CGI主要的功能不外乎在服务器应⽤程序和客户之间传递信息。

我们知道,通常CGI应⽤在服务器和客户端传递信息是通过输⼊输出流来实现的,如UNIX平台下的CGI,通过读取输⼊流Scanf来获取⽤户输⼊,读取输出流printf向⽤户输出结果。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Page 21
printf ("Content-type:text/plain\n\n"); n=0; if (getenv("CONTENT-LENGTH")) n=atoi(getenv("CONTENT-LENGTH")); for (i=0; i<n;i++){ int is-eq=0; c=getchar(); switch (c){ case '&':c='n';break; case '+':c=' ';break; case '%':{ char s[3]; s[0]=getchar(); s[1]=getchar(); s[2]=0; c=htoi(s); i+=2;
Page 17
Page 18
数据传送格式
当用户填完表格并按了SUBMIT按钮后,Web浏览器并非 将用户所填的数据直接送给Web服务器,而先要经过一定 的编码处理。Web浏览器总是将数据按照“变量名=变量 值”这样的数据对格式进行编码,并且每对数据之间用一 个&符号相连接。其中“变量名”就是Form元素中的 NAME属性值;“变量值”则是用户在输入框中所输入的 数据,或者是用户所选择的数据(即RADIO, CHECKBOX,OPTION中的VALUE值)。并且Web浏览 器将用户数据中的所有空格都替换成 "+ "号。另外一些特 殊字符的表示使用转义符 "% "后面加上该特殊字符的十 六进制ASCII码。特殊字符主要包括 "= "、 "+ "、 "& "、 "% "以及多行文本中的回车,换行符,所有不能直接显示 的高位ASCII符等。
Page 19
例如在上例中用户填入了下述信息(其中\n表示回车换 行): name "J&K " sex "male " flavor "apple " flavor "orange " opinion "I think it is necessary that\nman eat fruit everyday. " 则Web浏览器发送数据时的字符序列为: name=J%26K&sex=male&flavor=apple&flavor=orang e&weight=middle&opinion=I+think+it+is+necessary+ that%0D%0Aman+eat+fruit+everyday.
使用POST,用户数据不显示在URL后。
Page 9
HEAD方法
与GET方法类似,但是从Web浏览器传递给服务器的仅仅 是HTTP的头信息。
Page 10
2、CGI 接口标准
CGI接口标准包括标准输入、环境变量、标准输出三部分。 1.标准输入

CGI程序像其他可执行程序一样,可通过标准输入 (stdin)从Web服务器得到输入信息,如Form中的数据,这 就是所谓的向CGI程序传递数据的POST方法。这意味着 在操作系统命令行状态可执行CGI程序,对CGI程序进行调 试。
Page 11
2.环境变量 操作系统提供了许多环境变量,它们定义了程序的执行环 境,应用程序可以存取它们。Web服务器和CGI接口又另外 设置了自己的一些环境变量,用来向CGI程序传递一些重要 的参数。CGI的GET方法还通过 环境变量QUERYSTRING向CGI程序传递Form中的数据。 3.标准输出 CGI程序通过标准输出(stdout)将输出信息传送给 Web服务器。传送给Web服务器的信息可以用各种格式, 通常是以纯文本或者HTML文本的形式,这样我们就可以在 命令行状态调试CGI程序,并且得到它们的输出
c语言开发cgi基础
目录
cgi概述
cgi接口标准
增加交互能力—Form
cgi编程实现
Page 2
1 、CGI概述
CGI(Common Gateway Interface: 公用网关接口)规定 了Web服务器调用其他可执行程序(CGI 程序)的接口协议 标准。Web服务器通过调用CGI程序实现和Web浏览器的 交互,也就是CGI程序接受Web浏览器发送给Web服务器 的信息,进行处理, 将响应结果再回送给Web服务器及Web 浏览器。CGI程序一般完成Web网页中表单(Form)数据的 处理、数据库查询和实现与传统应用系统的集成等工作。
Page 15
3、增加交互能力——Form
Form元素下面我们就来简要介绍一下Form表中的常用 元素: <FORM ACTION= "URL信息 " METHOD=数据传送 方法> Form表内容
......
</FORM>
Page 16
form表单实例
<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>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>
Page 3
cgi输入输出原理
Page 4
cgi简单实例 留言板 首先,在浏览器上有一个用于输入留言的文本框, 当客户输入留言之后点击提交按钮,这个时候就 启动了服务器上cgi目录下特定的程序,对数据进 行处理,在这个例子中,cgi所做的处理有两个, 第一:使用户在浏览器上看到“留言成功”的字 样,第二:将用户的留言保存在服务器上特定的 文本或者数据库内,这样利用cgi就可以实现服务 器和客户端的交互。
Page 5
总结:简单来说,从物理上讲cgi实际是运 行在web服务器上的一段程序,提供了同 客户端html页面的接口,任何符合cgi标准 的程序都是cgi程序。
Page 6
CGI方法
CGI方法是指调用CGI程序的途径,也就是如何向服务器 提出请求,在该请求中定义了程序如何接收用户的数据。 CGI方法主要有三种,其中两种较为常用。
使用GET方法时,可以在地址栏中看到URL后的用户数据 如:/hello.html? name=jack&id=1。
Page 8
POST方法
WEB服务器通过stdin(标准输入),向CGI程序传输数 据。 POST方法利用CONTENT_LENGTH值确定用户的数据 长度。 在用户数据较大时采用POST
Page 12
环境变量
环境变量是文本串(名字/值对),可以被其他程序设置 或者 访问。它们是Web服务器传递数据给CGI程序的简单手段, 之所以称为环境变量是因为它们是全局变量,任何程序都 可以存取它们。
Page 13
下面是CGI程序设计中常常要用到的一些环境变量。 HTTP-REFERER:调用该CGI程序的网页的URL。 REMOTE-HOST:调用该CGI程序的Web浏览器的机 器名和域名。 REQUEST-METHOD:指的是当Web服务器传递数据给 CGI程序时所采用的方法,分为GET和POST两种方法。 GET方法仅通过环境变量 (如QUERY-STRING)传递数据 给CGI程序,而POST方法通过环境变量和标准输入传递数 据给CGI程序,因此POST方法可较方便地传递较多的数据 给CGI程序。
Page 20



下面是一个对Form数据进行解析并将结果回送给Web服务器的CGI程序。 #include <stdio.h> #include <stdlib.h> #include <strings.h> /* convert hex string to int */ int htoi(char *s) { char *digits="0123456789ABCDEF"; if (islower (s[0])) s[0]=toupper(s[0]); if (islower (s[1])) s[1]=toupper(s[1]); return 16 * (strchr(digits, s[0]) -strchr (digits,'0'))+(strchr(digits,s[1])-strchr(digits,'0')); } main() { int i,n; char c;
相关文档
最新文档