Windows环境下的CGI程序设计简介

录入/江湖小子

摘要:起源于UNIX平台的CGI程序是编写交互式Web程序的主要工具,是实现Web数据库的动态查询,动态更新的主要手段。随着Windows平台的不断发展,愈来愈多的公司采用Windows作为WWW服务器的工作平台,由于Windows和UNIX的差异,在Windows环境下的CGI程序设计和在UNIX环境下有所不同。

GGI简介
GGI(Common GatewayInterface)即通用网关接口,它定义了一个WWW服务器如何与外部程序(CGI程序)进行通讯的接口。通过这个通用网关接口,服务器可以向CGI程序发送信息,CGI程序也可以向服务器回送信息,它解决以下问题:

1. WWW服务器向CGI程序如何传送信息
2. WWW服务器向CGI程序提供什么样的信息
3. WWW服务器向CGI程序提供的信息的格式
4. CGI程序向WWW服务器返回什么样的信息
5. CGI程序向WWW服务器返回信息的格式

第一步浏览器与WWW服务器连接,并发出请求;第二步服务器运行CGI程序,并向CGI程序传送从浏览器收到的请求;第三步CGI程序处理完成后将结果返回给WWW服务器;第四步WWW服务器将CGI程序返回的结果返回人浏览器。
WWW服务器最早是在UNIX平台上开发的,它只支持一种CGI,效率也很高。但当WWW服务器引入到Windows平台后,现存的CGI规范所定义的通讯方法不适用于在WWW服务器与Windows程序间传递数据。后来,人们提出了自己的通讯方法,其中Windows CGI被广大CGI程序员所接受,并得到大多数WWW服务器的支持。Windows CGI的通讯方式在Windows CGI中,与UNIX环境下CGI程序采用标准输入输出与WWW服务器进行数据通讯不同,Windows CGI程序与WWW服务器间的通讯通过临时文件进行;

1 WWW服务器接收浏览器对Windows CGI程序的请求;
2 WWW服务器把要传送给Windows CGI程序的数据放在CGI profile的主输入文件中,如果有有附加的数据文件,该数据文件的路径也包含在CGI profile文件中。CGI profile也包含服务器要求Windows CGI程序输出结果的文件名及其路径,这个文件称为CGI输出文件。
3 WWW服务器执行Windows CGI程序,并将CGI profile作为它的第一个命令行参数。
4 WindowsCGI程序开始执行,WWW服务器在等待CGI结束的过程中,同时还可以处理其它请求或者CGI请求。
5 WindowsCGI程序读取作为命令行参数的profile文件及其它附加的数据文件,并进行处理。
6 WindowsCGI程序结束前,将输出结果写入WWW服务器指定的CGI输出文件中。
7 WWW服务器在WindowsCGI程序运行结束后,读取CGI输出文件,将数据打包发送给发出请求的浏览器。
8 WWW服务器然后删除处理该请求所产生的临时文件。
Windows CGI程序的设计可以使用C、C++,BASIC,FORTRAN等能够产生可执行程序的语言编写。你可选择最擅长的语言来编写CGI程序。下面我们以VB5.0经编程语言,以Website为WWW服务器向大家介绍Windows CGI的编写方法。Windows CGI程序首先要从临时文件中读取有关数据,作为程序运行的参数。Windows CGI程序的输出数据流的方式返回给WWW服务器。数据流包含两部分:文件头(head)和文件主体(body),文件头定义文件主体的MIME格式,文件头与文件主体之间必须有空行间隔。(关于MIME格式请参见有关资料)从临时文件中读取的数据需要进一步解析分离,这是一项比较复杂的工作。所幸的是有人已经成为我们做了这项工作,CGI32.BAS就是在Win95/NT下使用VB开发Windows CGI程序的接口,它实现了数据的解析分离并将处理结果回浏览器。CGI32.BAS由Robert B.de
nny开发,可以从netcom.com站点得到。

CGI32.BAS库模块简介
CGI32.BAS库模块简介为设计Windows CGI程序建立了一个CGI框架,将该库模块加入到项目文件中后,你就不必关心处理CGI profile文件和其它输入数据文件的细节,只须在CGI_Main过程中加入自己的代码,存取列为CGIprofile文件中的所有CGI变量和FORM表单字段。CGI32.BAS完成下面的工作:
1 定义、赋值全局VB变量以表示CGI profile文件中列出的数据。
2 打开CGI输出文件。
3 设置缺省的运行错误处理程序。
4 提供与CGI输入输出有关的过程。
5 如CGI程序的窗口环境下以交互方式进行,调用Inter_Main过程。
6 如CGI程序以非交互方式运行,调用CGI_Main过程。
CGI32.BAS中的主要程序/函数及部分主要CGI变量如表1所示:
表1 CGI32.BAS中的主要程序/函数及部分主要CGI变量。

利用VB库模块编写的CGI程序的一般步骤如下:
1.首先,建立一个不带窗体的项目文化;
2 加入CGI32.BAS库模块;
3 创建新模块,将CGI主程序放入CGI_Main过程中,在Inter_Main过程中加入提示信息。
4 建立可执行文件,并将该文件放入WWW服务器程序下的CGI-WIN子目录中。

下面以一个简单例子介绍Windows CGI的编写方法。当用户打开页面时,输入姓名,单击“完成”按钮后,就会出现欢迎页面,在页面中会出现用户输入的姓名及访问者的统计信息,这是不是很有趣呢!

初始页面如图2所示,其HTML文件内容如下:
〈html>
<head><title>
</title></head>
<body><center>
欢迎光临<hr>
<form method="post"...\cgi-win\test\hello.exe">
请输入您的姓名<br>
<input type="text"name="name"size=10><br>
<input type="submit"value="完成></center>
</body></html>
产生图3所示的动态页面的CGI程序的VB源文件如下:
Sub CGI_Main()
Dim fnum,num,x As Integer
funm=FreeFile
Open"c:\cornter.txt"For Input As#fnum
Input#fnum,x
Close#fnum
fnum=FreeFile
Open"c:\counter.txt"For Output As#fnum
num=x+1
Send("Content-Type:text/html")‘输出文件的MIME类型
Send("")‘文件头与文件主体必须有空行间隔
Send("<HTML><HEAD><TITLE>欢迎光临</TITLE></HEAD>")
Send("<BODY>")
Send("(CENTER>")
Send("欢迎<font color='ff0000'>" & GetSmallField("name")&"</fonr>光临!”)

Send("<HR>")
Send("您是第<font color='00ff00'>"& num)
Send("</font>位光临者!”)
Send("</CENTER></BODY></HTML>")
Print#fnum,num
Close#fnum
End Sub
Sub Inter_Main() ‘以交互方式运行时,给出警告信息
MsgBox"This is a cgi program for Web Sever!"
End Sub

结束语
WindowsCGI浅显易懂,使用起来非常方便。由于通过文件实现数据通讯受物理磁盘读写速率的限制,因而Windows CGI比其它CGI方法效率要低一些,如通过环境变量。此外,CGI程序只有在结果生成完成后,才将结果发送出去,对于一些要求有高实时性的应用来说,用Windows CGI来实现就不适合。
 
?