用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++基础教程 Web 编程 网页浏览、CGI 架构图

C++基础教程 Web 编程 网页浏览、CGI 架构图
c基础教程web编程网页浏览cgi架构图wwwnordridesigncomweb编程图片通用网关接口commongatewayinterface简称cgi是一组定义如何将信息在web服务器和一个自定义脚本之间交换的标准
C++基础教程 Web 编程 网页浏览、CGI 架构图
Web 编程 什么是 CGI ? [图片]通用网关接口(Common Gateway Interface),简称 CGI,是一组定义如何将信息在 Web 服务器和一个自定义脚 本之间交换的标准。

网页浏览
要了解 CGI 的概念,那我们先来看看,当我们点击超链
接来浏览特定的网页或 URL 时会发生什么。

[图片]您的浏览器连接到 HTTP Web 服务器,并且请 求 URL ,文件名。[图片]Web 服务器将会解析 URL, 并且会查找文件名。

如果找到所请求的文件,那么 Web 服务器会将该文件发送给
浏览器,否则它会发送一个错误信息表明您请求了一个错误
的文件。[图片]Web 浏览器的响应来自于 Web 服务器,并且 浏览器要显示所接收到的文件或者错误消息的响应。


[图片]目前 CGI 的规范是由 NCSA 维护的;NCSA 定义
CGI 如下:[图片]通用网关接口(CGI),是外部网关程序与
信息服务器(例如,HTTP 服务器)之间的接口标准。[图片] 目前应用的版本是 CGI /1.1;CGI/1.2 版本正在开发中。

然而,也可以以这样的方式来设置 HTTP 服务器:每 当在某个目录中的文件被请求时,该文件并不被发送回; 代替的是,这个请求作为一个程序来被执行,由该程序产 生输出,并被发送回给浏览器来显示。

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,通过该命令打开临时文件。

CGIC简明教程目录(CGI篇)

CGIC简明教程目录(CGI篇)

CGIC简明教程目录(CGI篇)CGIC简明教程目录本系列的目的是演示如何使用C语言的CGI库“CGIC”完成Web开发的各种要求。

基础知识* 1: 使用CGIC的基本思路* 2: 获取Get请求字符串* 3: 反转义* 4: 获取请求中的参数值进阶训练* 用CGIC实现文件上传CGIC简明教程1:使用CGIC的基本思路C语言编程是一项复杂且容易出错的工作,所以在完成复杂任务时,一定要选择合适的库。

对于用C语言编写CGI程序则更是如此。

CGIC是非常优秀的C语言CGI库函数。

其下载地址为:/cgic/#obtain,现在的版本号是2.05。

本站从今天开始,将逐步介绍如何使用CGIC完成各种操作,也可以说是一个Tutorial。

(注:本系列涉及的编程环境都是Linux,Windows用户需要对用到的操作系统命令稍作修改)本文纲要:CGIC的安装、测试安装、使用CGIC的基本思路;1) CGIC的下载安装从上面提供的官方网址下载了CGIC库之后,解开压缩包,里面有大约10个文件,有用的是:cgic.h:头文件;cgic.c:CGIC的源代码文件;cgictest.c:CGIC库的作者提供的一个CGI程序例子;capture.c:用于调试CGI程序的工具;Makefile:安装CGIC的脚本文件;可以看到,整个库实际上就是cgic.c一个文件,可以说是非常的精炼。

我们可以把CGIC安装为操作系统的一个动态链接库,这样我们每次编译的时候,就不需要有cgic.c这个源文件了。

但是由于需要(以后将会看到),我们将修改cgic.c代码,所以我们不把它安装进系统。

每次编译的时候,只要把cgic.c和cgic.h放到当前文件夹就好了。

2) 测试安装在开始编写你自己的CGI程序之前,一定要先走通他的例子程序,免得后来程序出错的时候还不知道是配置有问题,还是你的程序代码有问题。

我们用他自带cgictest.c来实现自己的第一个C语言CGI程序。

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编程的首选语言之一。

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疯狂代码 /。

C语言Web开发使用CGI和服务器端脚本

C语言Web开发使用CGI和服务器端脚本Web开发是当今社会中一个非常热门的领域。

为了开发出高效、强大的网站和网络应用程序,掌握编程语言成为了必备技能之一。

而在Web开发中,C语言是一种强大而灵活的选择。

本文将介绍C语言在Web开发中使用CGI(通用网关接口)和服务器端脚本的方法和技巧。

一、CGI简介CGI是一种将网页与服务器端脚本语言(如C语言)进行交互的标准接口。

它允许我们在网页中执行服务器端的脚本,从而动态地生成和展示内容。

在C语言中,我们可以使用CGI来处理来自用户的请求,并生成相应的响应内容。

二、为什么选择C语言虽然现代Web开发中使用的语言有很多种,但是C语言在性能和灵活性方面具有独特的优势。

C语言是一种基础且底层的语言,可以直接操作内存和硬件资源,提供了更精确的控制和更高效的执行。

因此,对于一些对性能要求较高的Web应用程序,使用C语言进行开发是一种明智的选择。

三、CGI的实现步骤1. 编写C语言脚本首先,我们需要编写一个C语言脚本来实现我们的逻辑。

这个脚本将接收来自用户的请求,并根据请求生成相应的响应。

我们可以使用C标准库中的相关函数来处理网络通信和数据传输。

2. 配置服务器接下来,我们需要配置服务器以支持CGI脚本的执行。

具体的配置方法因服务器而异,一般需要修改服务器配置文件并将CGI脚本的位置和访问权限进行设置。

3. 发布脚本将编写好的C语言脚本发布到服务器上的指定目录中。

确保脚本的路径和访问权限设置正确,以便服务器能够正确地执行脚本。

四、服务器端脚本的使用除了使用CGI,我们还可以使用服务器端脚本来进一步简化和优化Web开发过程。

服务器端脚本是在服务器执行的脚本,用于生成和处理动态的Web内容。

在C语言中,我们可以使用FastCGI(一种高性能的CGI实现)等技术来开发服务器端脚本。

1. FastCGI简介FastCGI是一种高性能的CGI协议扩展,旨在提供更高效的CGI脚本执行方式。

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向⽤户输出结果。

cgi教程:第六章

第六章: 调查表对于本周的程序----选票程序,我不想多说什么。

我只是想在本程序内教给大家如何使用perl语言或C语言如何处理字符串的实例。

让我们先看看代码:页面文件--pote.html<HTML><TITLE>投票程序</TITLE><h1>投票程序</h1><FORM METHOD="post" ACTION="/cgi-bin/vote.pl">一.你喜欢谁?<br><input type="radio" name="idol" value="A" checked>张德陪<br><input type="radio" name="idol" value="B">阿加西<br><input type="radio" name="idol" value="C">桑普拉斯<br><input type="radio" name="idol" value="D">贝克<br><input type="radio" name="idol" value="D">顾懿<br><input type="submit" value="执行"><input type="reset" value="取消"></form>查询:<a href="/cgi-bin/vote.pl?command=view">选举投票结果</a></html>CGI程序:--vote.pl#!perlprint"Content-type:text/html\n\n";print"<titel>投票系统</title>";if($ENV{'REQUEST_METHOD'}eq"POST"){read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'});}elsif($ENV{'REQUEST_METHOD'}eq"GET"){$buffer=$ENV{'QUERY_STIRNG'};}@pairs=split(/&/,$buffer);foreach $pair(@pairs){($name,$value)=split(/=/,$pair);$value=~tr/+//;$value=~s/%([a-f A-F 0-9][a-f A-f 0-9])/pack("C",hex($1))/eg;$FORM{$name}=$value;}$filename="/vote.dat";%NAME=("A","张德陪","B","阿加西","C","桑普拉斯","D","贝克","E","顾懿");if($ENV{'REQUEST_METHOD'}eq"POST"){print"Content-type:text/html\n\n";print"<titel>投票系统</title>";print"<h1>投票系统的例子</h1>";open(FILE,"<$filename")||die"不能打开文件,请和管理员联系\n";for($i=0;$i<2;$i++){$file[$i]=<FILE>;$file[$i]=~s/\n$//;}close(FILE);@item=split(/:/,$file[0]);@vote=split(/:/,$file[1]);for($i=0;$i<@item;$i++){if($FORM{'idol'}eq$item[$i]){$vote[$i]++;last;}}open(FILE,">filename")||die"Can't Open the file";$item=join(":",@item);$vote=join(":",@vote);pirnt FILE "$item\n";print FILE "$vote\n";close (FILE);print"<h2>您是投票给$NAME{$FORM{'idol'}},谢谢您的选票!<h2>";print"查询<a href=\"/cgi-bin/vote.pl?command=viem\">投票结果系统</a>";}if($FORM{'command'}eq"view"){print "HTTP/1.0 200\n";print "Content-type:text/html\n\n";print"<title>投票结果</title>";print"<h1>投票结果</h1>";open (FILE,"$filename")||die"文件打开错误";for($i=0;$i<2;$i++){$file[$i]=<FILE>;$file[$i]=~s/\n$//;}close(FILE);@item=split(/:/,$file[0]);@vote=split(/:/,$file[1]);print"<table border=1>";for($i=0;$i<@item;$i++){print"<tr><td>姓名</td><td>$NAME{$item[$i]}</td><td>票数</td>,td>$vote[$i]</td><tr>";}print "</table>";}这个程序是要各位学习Perl的分解字符串的功能。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

用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>请在下面填入乘数和被乘数,按下确定后可以看到结果。

23. <INPUT NAME="m"SIZE="5">24. <INPUT NAME="n"SIZE="5"><BR>25. <INPUT TYPE="SUBMIT"VALUE="确定">26. < /FORM >1. G ET 和 POST2. 表单从浏览器发给服务器有两种方法. GET 和 POST.3.4. 我们上面谈论的方法,实际是GET,它将数据打包放置在环境变量QUERY_STRING中作为URL整体的一部分传递给服务器。

5.6. P OST做很多类似GET同样的事情, 不同的地方就是它是分离地传递数据给脚本. 你的脚本通过标准输入获取这些数据. (有些Web服务器是存储在临时文件中.) 这个QUERY_STRING环境变量将不再设置.7.8. 那你用那个方法呢? POST是个安全的方法, 尤其如果你的表单中有很多数据的话. 当你用GET, 这个服务器就分配变量QUERY_STRING给所有的表单数据, 但是这个变量可存储量是有限的. 换句话说,如果你有很多数据但是你又用GET,你会丢失很多数据.9.10. 如果你用POST, 你可以尽可能多地使用数据, 因为这些数据从来也不分配到一个变量里.用c语言写cgi程序(2)第一个CGI程序:Hello World Hello World!任何程序语言的学习都是从打印Hello World!开始的,这样不但可以熟悉程序的流程和大体结构,而且最大限度的避免了一些细小的错误,给初学者信心。

hello.c#include <stdio.h>int main(){printf("Content-Type:text/plain;charset=us-ascii\n\n");printf("Hello World\n\n");return 0;}#gcc –o hello.cgi hello.c#cp hello.cgi /var/www/cgi-bin/用GCC将源文件编译成CGI程序,并拷贝到服务器所制定的cgi程序运行目录中。

在浏览器中输入:192.168.44.128/cgi-bin/hello.cgi可以看到页面打印出“H ello World”。

让我们再来一个更简单的CGI脚本:(Linux下)#vim /var/www/cgi-bin/hellow.cgiecho Conten-Type: text/plainechoecho/bin/date在浏览器中输入:192.168.44.128/cgi-bin/hellow.cgi,我们看到在浏览器页面中输出了当前时间。

呵呵,这时应该对CGI是什么有比较深的印象里吧?CGI就是在服务器端执行的一段程序,这段程序执行完毕得到结果后会反馈显示给客户。

编写CGI程序的可以是任何形式的语言。

在所有CGI程序中,第一句必须输出HTML头来告诉浏览器这是一个什么样的内容,这个头是服务器与浏览器之间的信息协议并不属于文本的一部分其实Contet-Type指定的就是MIME信息。

有三个类型的头部:Contet-Type,Location,Status。

Contet-Type最为常用Content-Type行后必须接两个空行,不然浏览器不能正确的认出内容类型来。

评论: 是的确实是要加的,CGI也是linux下的一个程序,只不过是后缀名改变了的一个shell程序而已,shell要执行的话,前面是必须执行shell的外壳的,所以必须加#!/bin/sh,当初复制上来的时候没有复制顶部的那个执行命令,不好意思疏忽了用c语言写cgi程序(3)---实现文件上传敬告:其实当前的cgic版本已经有上传的功能了,可以看看自带的test文件用C语言编写cgi程序的话,多半会用到CGIC。

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

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

下载: upload.cview plaincopy to clipboardprint?1. #include<stdio.h>2. #include<string.h>3. #include<unistd.h>4. #include<fcntl.h>5. #include<sys/stat.h>6. #include"cgic.h"7. #define BufferLen 10248. i nt cgiMain(void){9. c giFilePtr file;10. int targetFile;11. mode_t mode;12. char name[128];13. char fileNameOnServer[64];14. char contentType[1024];15. char buffer[BufferLen];16. char *tmpStr=NULL;17. int size;18. int got,t;19. cgiHeaderContentType("text/html");20. //取得html页面中file元素的值,应该是文件在客户机上的路径名21. if (cgiFormFileName("file", name, sizeof(name)) !=cgiFormSuccess) {22. fprintf(stderr,"could not retrieve filename/n");24. }25. cgiFormFileSize("file", &size);26. //取得文件类型,不过本例中并未使用27. cgiFormFileContentType("file", contentType, sizeof(contentType));28. //目前文件存在于系统临时文件夹中,通常为/tmp,通过该命令打开临时文件。

临时文件的名字与用户文件的名字不同,所以不能通过路径/tmp/userfilename 的方式获得文件29. if (cgiFormFileOpen("file", &file) != cgiFormSuccess) {30. fprintf(stderr,"could not open the file/n");31. goto FAIL;32. }33. t=-1;34. //从路径名解析出用户文件名35. while(1){36. tmpStr=strstr(name+t+1,"//");37. if(NULL==tmpStr)38. tmpStr=strstr(name+t+1,"/");//if "//" is not path separator, try "/"39. if(NULL!=tmpStr)40. t=(int)(tmpStr-name);41. else42. break;43. }44. strcpy(fileNameOnServer,name+t+1);45. mode=S_IRWXU|S_IRGRP|S_IROTH;46. //在当前目录下建立新的文件,第一个参数实际上是路径名,此处的含义是在cgi程序所在的目录(当前目录))建立新文件47. targetFile=open(fileNameOnServer,O_RDWR|O_CREAT|O_TRUNC|O_APPEND,mode);48. if(targetFile<0){49. fprintf(stderr,"could not create the new file,%s/n",fileNameOnServer);50. goto FAIL;51. }52. //从系统临时文件中读出文件内容,并放到刚创建的目标文件中53. while (cgiFormFileRead(file, buffer, BufferLen, &got) ==cgiFormSuccess){55. write(targetFile,buffer,got);56. }57. cgiFormFileClose(file);58. close(targetFile);59. goto END;60. FAIL:61. fprintf(stderr,"Failed to upload");62. return 1;63. END:64. printf("File /"%s/" has been uploaded",fileNameOnServer);65. return 0;66. }<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN""/TR/html4/strict.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><title>Test Upload</title><meta name="author" content="Jack"><!-- Date: 2007-08-30 --></head><body><form action="cgi-bin/upload.cgi" method="post" enctype="multipart/form-data" target="_ blank"><input type="file" name="file" value="" /><input type="submit" name="submit" value="OK"></form></body></html>最后的文件目录结构为/MyWebRoot|—/upload.html|—/cgi-bin|——/upload.cgi当然,你必须配置能够cgi-bin,并且程序要有权限在cgi-bin目录下创建文件(因为此例把文件上传到cgi-bin目录下)。

相关文档
最新文档