CGI之C语言篇
CGI之C语言篇发布时间:2005-04-22为什么要进行CGI编程在HTML中,当客户填写了表单,并按下了发送(submit)按钮后,表单的内容被发送到了服务器端,一般的,这时就需要有一个服务器端脚本来对表单的内容进行一些处理,或者是把它们保存起来,或者是按内容进行一些查询,或者是一些别的什么。
没有了CGI,WEB的世界就完全失去了它的交互性,所有的信息都变成单向的了,而不能够有任何的反馈。
有的人认为可以用JavaScript来代替CGI程序,这其实是一个概念上的错误。
JavaScript只能够在客户浏览器中运行,而CGI却是工作在服务器上的。
他们所做的工作有一些交集,比如表单数据验证一类的,但是JavaScript是绝对无法取代CGI的。
但可以这样说,如果一项工作即能够用JavaScript来做,又可以用CGI来做,那么绝对要使用JavaScript,在执行的速度上,JavaScript比CGI有着先天的优势。
只有那些在客户端解决不了的问题,比如和某个远程数据库交互,这时就应该使用CGI了。
简单的说来,CGI是用来沟通HTML表单和服务器端程序的接口(interface)。
说它是接口,也就是说CGI并不是一种语言,而是可以被其他语言所应用的一个规范集。
理论上讲,你可以用任何的程序语言来编写CGI程序,只要在编程的时候符合CGI规范所定义的一些东西就可以了。
由于C语言在平台无关性上表现不错(几乎在任何的系统平台下都有其相应编译器),而且对大多数程序员而言都算得上很熟悉(不像Perl),因此,C是CGI编程的首选语言之一。
如何使用C来编写CGI程序作为CGI编程的最为简单的例子,就是进行表单的处理。
因而在这篇文章中,我们主要介绍的就是如何用C来编写CGI程序来进行表单处理。
对于那些使用了属性“METHOD=GET”的表单(或者没有METHOD属性,这时候GET是其缺省值),CGI定义为:当表单被发送到服务器断后,表单中的数据被保存在服务器上一个叫做QUERY_STRING的环境变量中。
这种表单的处理相对简单,只要读取环境变量就可以了。
这一点对不同的语言有不同的做法。
在C语言中,你可以用库函数getenv(定义在标准库函数stdlib中)来把环境变量的值作为一个字符串来存取。
你可以在取得了字符串中的数据后,运用一些小技巧进行类型的转换,这都是比较简单的了。
在CGI程序中的标准输出(output)(比如在C中的stdout文件流)也是经过重定义了的。
它并没有在服务器上产生任何的输出内容,而是被重定向到客户浏览器。
这样,如果编写一个C的CGI程序的时候,把一个HTML文档输出到它的stdout上,这个HTML文档会被在客户端的浏览器中显示出来。
这也是CGI程序的一个基本原理。
我们来看看具体的程序实现,下面是一段HTML表单:< FORM ACTION="/cgi-bin/mult.cgi" >< P >请在下面填入乘数和被乘数,按下确定后可以看到结果。
< INPUT NAME="m" SIZE="5" >< INPUT NAME="n" SIZE="5" >< BR >< INPUT TYPE="SUBMIT" VALUE="确定" >< /FORM >我们要实现的功能很简单,就是把表单中输入的数值乘起来,然后输出结果。
其实这个功能完全可以用JavaScript来实现,但为了让程序尽量的简单易懂,我还是选择了这个小小的乘法来作为示例。
下面就是处理这个表单的CGI程序,对应于FORM标签中的ACTION属性值。
#include < stdio.h >#include < stdlib.h >int main(void){char *data;long m,n;printf("%s%c%c ","Content-Type:text/html;charset=gb2312",13,10);printf("< TITLE >乘法结果< /TITLE > ");printf("< H3 >乘法结果< /H3 > ");data = getenv("QUERY_STRING");if(data == NULL)printf("< P >错误!数据没有被输入或者数据传输有问题"); else if(sscanf(data,"m=%ld&n=%ld",&m,&n)!=2)printf("< P >错误!输入数据非法。
表单中输入的必须是数字。
");elseprintf("< P >%ld和%ld的成绩是:%ld。
",m,n,m*n);return 0;}具体的C语法就不多讲了,我们来看看它作为CGI程序所特殊的地方。
前面已经提到标准输出的内容就是要被显示在浏览器中的内容。
第一行的输出内容是必须的,也是一个CGI程序所特有的:printf("%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。
假设我们要实现的任务是这样的:把表单中客户输入的一段文本内容添加到服务器上的一个文本文件的后面。
这可以看作是一个留言版程序的雏形。
显然,这个工作是无法用JavaScript这种客户端脚本来实现,也算得上真正意义上的CGI程序了。
看起来这个问题和上面讲的内容很相近,仅仅是用不同的表单和不同的脚本(程序)而已。
但实际上,这中间是有一些区别的。
在上面的例子中,GET的处理方法可以看作是“纯查询(pure query)”类型的,也就是说,它与状态无关。
同样的数据可以被提交任意的次数,而不会引起任何的问题(除了服务器的一些小小的开销)。
但是现在的任务就不同了,至少它要改变一个文件的内容。
因而,可以说它是与状态有关的。
这也算是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源代碼:#include < stdio.h >#include < stdlib.h >#define MAXLEN 80#define EXTRA 5/* 4个字节留给字段的名字"data", 1个字节留给"=" */#define MAXINPUT MAXLEN+EXTRA+2/* 1个字节留给换行符,还有一个留给后面的NULL */#define DATAFILE "../data/data.txt"/* 要被添加数据的文件 */void unencode(char *src, char *last, char *dest){for(; src != last; src++, dest++)if(*src == "+")*dest = " ";else if(*src == "%") {int code;if(sscanf(src+1, "%2x", &code) != 1) code = "?";*dest = code;src +=2;}else *dest = *src;*dest = " ";*++dest = "";}int main(void){char *lenstr;char input[MAXINPUT], data[MAXINPUT];long len;printf("%s%c%c ", "Content-Type:text/html;charset=gb2312",13,10);printf("< TITLE >Response< /TITLE > ");lenstr = getenv("CONTENT_LENGTH");if(lenstr == NULL || sscanf(lenstr,"%ld",&len)!=1 || len > MAXLEN)printf("< P >表单提交错误");else {FILE *f;fgets(input, len+1, stdin);unencode(input+EXTRA, input+len, data);f = fopen(DATAFILE, "a");if(f == NULL)printf("< P >对不起,意外错误,不能够保存你的数据");elsefputs(data, f);fclose(f);printf("< P >非常感谢,您的数据已经被保存< BR>%s",data);}return 0;}从本质上来看,程序先从CONTENT_LENGTH环境变量中得到数据的字长,然后读取相应长度的字符串。
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程序(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>请在下面填入乘数和被乘数,按下确定后可以看到结果。
C++基础教程 Web 编程 网页浏览、CGI 架构图
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介绍
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"。
cgi工作原理
cgi工作原理
CGI (Common Gateway Interface) 是一种将服务器端程序和网页服务器进行通信的标准。
其工作原理如下:
1. 用户在网页上输入请求(如填写表单),点击“提交”按钮。
2. 网页服务器收到请求后,判断该请求需要通过 CGI 处理,然后将请求发送给 CGI 程序。
3. 服务器将用户的请求信息作为参数传递给 CGI 程序。
4. CGI 程序根据接收到的参数进行处理,并生成相应的HTML 或者其他格式的数据。
5. 服务器将 CGI 程序生成的数据返回给网页服务器。
6. 网页服务器将接收到的数据组织成页面内容,并返回给用户的浏览器进行展示。
通过 CGI,服务器可以动态生成内容并将其发送给用户。
CGI 可以处理多种类型的请求,例如提交表单、访问数据库、发送电子邮件等。
在 CGI 中,服务器和程序之间通过环境变量和标准输入输出流进行数据传递。
服务器将请求的数据信息传递给 CGI 程序,CGI 程序对数据进行处理,并将结果返回给服务器,最后由服务器返回给用户的浏览器。
需要注意的是,CGI 是一种通用的接口标准,并非某种具体的编程语言或技术。
CGI 程序可以使用多种编程语言编写,如Perl、Python、Java等。
服务器需要正确配置,并设置适当的权限来访问和执行 CGI 程序。
总结起来,CGI 是一种通过服务器和程序之间的通信实现动态网页功能的技术标准。
通过 CGI,服务器可以接收用户请求,
将请求传递给 CGI 程序进行处理,然后将处理结果返回给用户的浏览器。
用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,通过该命令打开临时文件。
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技术原理
CGI技术原理⼀、CGI技术1.1 CGI的提出 CGI是外部扩展应⽤程序与WWW服务器交互的⼀个标准接⼝。
按照CGI标准编写的外部扩展应⽤程序可以处理客户端(⼀般是WWW浏览器)输⼊的协同⼯作数据,完成客户端与服务器的交互操作。
这在实际应⽤中⾮常有⽤,如可以编写CGI外部扩展程序来访问外部数据库,客户端⽤户可以通过它和WWW服务器来进⾏数据查询。
CGI⼀般分两种:标准CGI和缓冲CGI。
所有的WWW服务器均应⽀持标准CGI,按标准CGI编写的程序与具体的WWW服务器⽆关。
⽽按缓冲CGI编写的程序与WWW服务器有关。
1.2 CGI的⼯作原理 1.标准CGI 客户端、服务器、CGI接⼝与外部程序间的关系可⽤图1-1表⽰(编排者:图略):如上图所⽰,服务器是客户端(如浏览器)与扩展程序之间的通道。
当客户端的⽤户完成了⼀定输⼊⼯作(⽐如填充完HTML⽂档中的FORM表)之后向服务器发出HTTP请求(称为CGI请求),服务器守护进程接收到该请求后,就创建⼀个⼦进程(称为CGI进程)。
该CGI⼦进程将CGI请求的有关数据设置成环境变量,在外部CGI程序与服务器间建⽴两条数据通道(标准I/O),然后启动URL指定的CGI程序,并与该⼦进程保持同步,以监测CGI程序的执⾏状态。
⼦进程通过标准输出流将处理结果传递给服务器守护进程,守护进程再将处理结果作为应答消息回送到客户端。
外部CGI程序通过环境变量、命令⾏参数、标准输⼊输出与WWW服务器进⾏通讯,传递有关参数和处理结果。
*环境变量:当服务器守护进程创建⼦进程运⾏CGI程序时,设置相应的环境变量和命令⾏参数,以传递客户端和服务器的有关信息给该⼦进程。
*命令⾏参数:命令⾏参数仅在有HTML⽂档中有SINDEX查询的情况下使⽤。
*标准输⼊输出:当HTTP请求模式采⽤POST⽅式时,CGI程序通过标准输⼊流和有关环境变量来获取客户端传输数据;如采⽤GET⽅式时,CGI程序直接通过环境变量获取客户端传输数据。
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脚本执行方式。
