cgi简单介绍

  转自:http://blog.csdn.net/zhulove86/article/details/7161771

cgi脚本进行数据的处理和反馈<一>

         由于在项目的网络开发中需要使用CGI脚本来实现通讯。通过本地的httpserver将需要处理的信息传送给CGI脚本,通过CGI脚本中预先实现的功能来处理。

在项目的实现过程中使用了开源的CGIC,是C语言CGI库函数。其中包括:

cgic.h:头文件;
cgic.c:CGIC的源代码文件;

capture.c:用于调试CGI程序的工具;

使用CGIC实现的基本思路:

       通过分析CGIC的代码,在cgic.c的代码可以看出,它定义了main函数。是通过cgic.C中的mian函数中来调用实现特定功能的函数,在我们功能实现的函数cgictest.c中定义了一个cgiMain函数。对于使用CGIC编写的CGI 程序,都是从cgic.c中的代码进入,在库函数完成了一系列必要的操作(比如解析参数、获取系统环境变量)之后,它才会调用我们自己定义的代码(定义的 cgiMain进入)。

      另外一点比较有意思的地方就是,cgi脚本程序输出给httpserver的方式都是使用printf把页面一行一行地打印出来,比如cgictest.c中的这一段代码:
fprintf(cgiOut, "<textarea NAME=\"address\" ROWS=4COLS=40>\n");
第一个参数cgiOut实际上就是stdin,所以我们可以直接使用printf,而不必使用fprintf。

 

使用C语言编写cgi脚本的时候还要声明自己输出的数据类型(声明文档类型),如:

cgiHeaderContentType("text/html");//html文档

cgiHeaderContentType("text/plain");//文本类型

cgiHeaderContentType("application/json");//json格式的数据

      主要目的告诉浏览器,这次传来的数据是什么类型,是一个HTML文档,还是一个bin文件。如果是个HTML文档,就通过浏览器窗口显示,如果是一个bin(二进制)文件,则打开下载窗口,让用户选择是否保存文件以及保存文件的路径。


其中http数据包中请求的数据在本地httpserver和cgi脚本中通过环境变量获取:

       cgiGetenv(&cgiServerSoftware,"SERVER_SOFTWARE");

       cgiGetenv(&cgiServerName,"SERVER_NAME");

       cgiGetenv(&cgiGatewayInterface,"GATEWAY_INTERFACE");

       cgiGetenv(&cgiServerProtocol,"SERVER_PROTOCOL");

       cgiGetenv(&cgiServerPort,"SERVER_PORT");

       cgiGetenv(&cgiRequestMethod,"REQUEST_METHOD");

       cgiGetenv(&cgiPathInfo,"PATH_INFO");

       cgiGetenv(&cgiPathTranslated,"PATH_TRANSLATED");

       cgiGetenv(&cgiScriptName,"SCRIPT_NAME");

       cgiGetenv(&cgiQueryString,"QUERY_STRING");

       cgiGetenv(&cgiRemoteHost,"REMOTE_HOST");

       cgiGetenv(&cgiRemoteAddr,"REMOTE_ADDR");

       cgiGetenv(&cgiAuthType,"AUTH_TYPE");

       cgiGetenv(&cgiRemoteUser,"REMOTE_USER");

       cgiGetenv(&cgiRemoteIdent,"REMOTE_IDENT");

      在cgi脚本中可以通过  fgets(input,cgiContentLength+1, stdin); 可以获取到content中的数据。


cgi脚本进行数据的处理和反馈(二)

简单介绍一下CGIC如何使用:

1、CGIC的下载和介绍:  

CGIC是非常实用和简洁的开源CGI库函数。下载地址为:www.boutell.com/cgic/#obtain,目前最新的版本号是2.05。提供两种格式

的压缩包:cgic205.tar.gz和cgic205.zip

 

解压:

tar -xvf cgic205.tar.gz  或者  unzip -d  cgic205.zip

 

CGIC库中总共有9个文件,包括一些帮助文档,makefile,和C源文件。

cgi.c    //cgic中的核心文件,进行初始化,环境变量设置等任务;

cgi.h    //头文件

capture.c  //用于进行调试的工具,通过cgi.c 源文件中的CGICDEBUG宏来控制是否需要打开调试工具

cgictest.c  //提供的一个sample

其中最为重要的是cgi.c文件,这可是我们cgi脚本生产和运行的核心,好比是法拉利的引擎一样。

2、编译

由于在CGIC的库中已经提供了makefile文件,如果是在X86的linux环境下我们可以直接使用这个makfile文件进行编译,生成cgictest.cgi(在库文件自带的makefile中定义的)。

如果是在arm或者mips等其他嵌入式平台上使用,则需要使用对应的交叉工具链;

我们也可以直接在命令行中输入命令编译:

 gcccgi.c cgictest.c –o  cgictest.cgi 

 

在自己设计和实现的cgi脚本中,必须要和cgi.c文件一起编译,为了方便可以实现将cgi.c文件打包为一个lib文档,在以后的实现中直接链接库文件即可。


3、运行和配置(环境有差别配置和运行稍有不同,这里用到开发板和PC):

CGI脚本不是放在server上就能顺利运行,如果要想使其在server上顺利的运行并准确的处理用户的request,则须对所使用的server进行必要的设置。

a、当初是在开发板上进行开发的,因此编译的cgi需要运行在开发板上。

b、开发板的httpserver使用的是httpd,编译好的CGI文件放在开发板server文件夹相应的位置,通过路由器直连开发板和PC机(设为同一网段,设置开发板的回环地址:ifconfig lo up)

c、通过PC的浏览器发送请求,通过httpserver可以调用到编译好的cgi脚本,最终结果在PC端的浏览器上显示。

这是因为CGI不同于javascript,javascript是在客户端执行的,在客户端就能直接得到结果,CGI是在服务器端运行,结果要通过服务器反馈给用户才能显示出来

 

配置:根据所使用的服务器类型以及它的设置把CGI程序放在某一特定的目录中或使其带有特定的扩展名。

在开发板端http server的目录下建立一个放置cgi脚本的cgi-bin目录(当然名字可以任意取,但作为习惯,一般叫做cgi-bin),然后在mini-httpserver的配置文件里指定CGI脚本文件的路径,以及CGI脚本的名称(一般默认为使用*.cgi)。

通过页面的http请求发送给开发板端的httpserver,具体格式如下:
http://127.0.0.1:8080/cgi-bin/test.cgi

其中:

地址:由于cgi脚本和httpserver都在开发板的本地因此使用本地地址:127.0.0.1。

端口:8080为开发板的httpserver和PC双方通信默认的端口。

CGI脚本路径:cgi-bin在httpserver根目录中。

CGI脚本名称:test.cgi

 

CGI处理步骤:1、通过网络协议把用户request发送到server;2、server接收用户请求并交由CGI脚本处理;3、CGI脚本把处理结果传送给server;4、server将结果传回给用户。


你可能感兴趣的:(cgi简单介绍)