用VC++编写CGI程序 2008-02-12

来源:互联网 发布:js中的confirm 编辑:程序博客网 时间:2024/06/07 10:11

     近年来,Internet与Intranet迅猛发展,企业纷繁创造自己的Intranet,以增强企业内部的联系,促进与外部世界的沟通,增强企业的竞争才能。通过创造自己的Internet服务器,企业能在网络上宣告广告,介绍本公司的情形与产品,收集顾客意见,以及创造虚拟电子商场等。大家都知道写一个HTML超文本文件放在World Wide Web服务器上,即可通过各种阅读器访问你的主页,但是如何使你的静态主页能响应客户的动作,并与本地的数据库联系,将数据库的相应内容传送给远端的阅读器呢?这就须要通过CGI接口进行联系。
     CGI全名是Common Gateway Interface,它是WWW服务器调用外部程序的接口通过CGI,WW W服务器能完成一些本身所力不能及的工作。

     在不同操作体系下CGI接口也不雷同,可分为Standard CGI接口、DOS CGI接口与Win CG I接口等。Standard CGI接口用于Unix体系,它是通过环境变量来实现WWW Server与CGI应用程序之间的联系。DOS CGI接口与Standard CGI接口原理类同。Win CGI接口则与前两者大不雷同。由于越来越多的WWW Server采取Windows体系,而Windows体系又不能有效地传递环境变量,由Bob Denny提出了一种Windows CGI尺度,并得以不断推广。
Win CGI是通过.ini文件来进行联系的。在Windows环境下,许多应用程序都是应用.ini 文件,即profile文件来定义一些根本设定,而Win CGI程序与WWW Server之间也正是通过pro file文件来实现联系的。当WWW Client通过WWW Server触发CGI程序时,WWW Server先动态生成几个文件于临时目录下,分为.ini、.inp、.out等文件。在WWW Server生成CGI程序的历程时,通过命令行参数将.ini文件的绝对路径传给CGI历程。.ini文件中也包括了.inp、.ou t等文件路径信息。这样,CGI程序可读取.ini和.inp文件所供应的信息,领会所有来自WWW Server端和与WWW Client端的数据。然后,CGI程序可以调用外部程序,或由CGI直接执行外部程序的功效,并将要传给客户端的信息以HTML文本的形式写在.out文件上。最后,WWW Server取.out文件的HTML文本,将信息传送给WWW Client端,并删除临时目录下的文件。那么,CGI的profile文件包括了什么数据呢?与Windows其它.ini文件一样,CGI profile 文件包括了许多session,每个session又包括一些key,以下是一个CGI profile的部份内容

[CGI]
Request Method=POST //传递方式,即HTML中的Form method有GET,POST,HEAD等。
Server Software=WebSite/1.1e
//Server的名称与版本。
Server Name=199.199.198.55
//Server的IP地址。
Server Port=80//Server的Socket Port。
Server Admin=tomy@vico.bme.zju.edu.cn//Server管理者的E-mail地址。
Referer=http://199.199.198.55/
//主页的URL路径。
Remote Address=199.199.198.89
//Client端的IP地址。
[System]
Output File=c:WebSitecgi-temp198ws.out//输出文件的路径名。
Content File=c:WebSitecgi-temp198ws.inp//输入文件的路径名。
[Form Literal]
type=B//接受到的Form data即client端动作的结果信息。


     原则上可用来编写CGI程序的语言有:perl, AppleScript, Unix Shell, VB, C/C++等。但在Windows(NT、3x、95)环境下,还是必须借助成熟的Windows编程语言才能编写出精致的Win CGI程序。C语言是一门深受宽大程序员喜好的语言,尤其是VCi++作为一门面向对象的语言,具备了Windows环境的许多根本功效,如OLE,ODBC等。通过ODBC这项功效,可以非常容易地连接FoxPro, Access, dBASE等多种数据库,而无需考虑各种数据库结构的区别。
     以下是笔者用VC++4.0编写的一个用Win CGI连接数据库的范例。应用者可在屏幕上选择,以查询ISP服务商供应的internet服务价格表。体系环境采取Windows 95,数据库采取FoxP ro2.5, WWW Server采取Website。

1.创造数据库
     本例的CGI程序是通过ODBC连接数据库,因此数据库建完后,应用32位ODBC驱动器加以登记。

2.编写HTML程序
     应用者可在屏幕上选择一服务类型,再按"提交"键,即可查询这一服务类型的各价格栏目。其HTML文本描述如下:
<HTML>
<HEAD>{TITLE>维科公司internet服务收费尺度</TITLE></HEAD>
<pre><H1>维科公司internet服务收费尺度</H1>
</P>
<hr><form method="POST" action="cgi-win/wincgi.exe">
您要查询的类型是:
<UL><LI>A类用户<input name="usertype" type=radio value="A">
<LI>B类用户<input name="usertype" type=radio value="B">
<LI>C类用户<input name="usertype" type=radio value="C">
<LI>D类用户<input name="usertype" type=radio value="D">
</UL>
<center>
<input type=submit value="提交"> <input type=reset value="取缔"></center>
</pre></form><hr>
</HTML>

3.编写VC++CGI程序

     Website为C++程序员供应了一个CCGI类,可在website目录下找到。该类供应了一些便利的函数,无需程序员编写一些直接与CGI界面打交道的底层工作,充足体现面向对象语言的优势。在VC++4.0中创造一个"Dialog based"工程框架。将CCGI类引入框架,即将cgi.h,cgi .cpp参加程序。然后用VC++的ClassWizard工具创造一个与数据库相对应的CUserSet类,该类继承MFC类库中的CRecordSet类。
首要代码加在wincgi.cpp文件中。


//程序:wincgi.cpp
#include "stdafx.h"
#include "wincgi.h"
#include "cgi.h"
#include "userset.h"
……
void ProcessCGI(CCGI *cgi);
BOOL CBaseApp::InitInstance()
{
CCGI cgi(m-ipCmdLine); //实例化CCGI类,并用命令行参数初始化
if(cgi.CalledAsCGI())
{
try
{
ProcessCGI(&cgi);
//在此做所有真正的工作
}
catch(CException* e)
{
cgi.HandleException(e);
//异常处置
e->Delete();
}
}
return FALSE;
}
void ProcessCGI(CCGI *cgi)
{
int i;
CString strTemp, strWebmaster, strReferer;
strWebmaster=cgi->GetCGIVar("Server Admin");
//获得Server管理者的E-mail地址。
strReferer=cgi->GetCGIVar("Referer"); //获得主页的URL路径。
CStringArray csaFields;
cgi->EnumFormFieldNames(csaFields);
//取得所有变量名,放在数组中。
cgi->WriteHTMLHeader();
cgi->WriteHTMLBody("<HEAD><TITLE>VC++CGI test</TITLE></HEAD>1512");
cgi->WriteHTMLBody("<BODY>1512");
CString csaFieldVal;
csaFieldVal=cgi->GetFormField(csaFields[0]);
//得到第一个变量的值,即"usertype"变量的值。
cgi->WriteHTMLBody("<h1>internet服务收费尺度查询结果</h1><hr>");
CUserSet m-user;
//实例化CUserSet类
char sfilter[80];
wsprintf(sfilter,"USER-TYPE=%s,csaFieldVal);
m-user.m-strFilter=sfilter;
//设置筛选器。
m-user.Open();
strTemp="<h2>"+m-user.m-USER-TYPE+"类用户"+"</h2>1512";
cgi->WriteHTMLBody(strTemp);
strTemp="<P>入网费:"+m-user-FARE-INI+".</P>1512";
cgi->WriteHTMLBody(strTemp);
……
strTemp="<P>通信费:"+m-user.m-FARE-COM+".</P>1512"
;
cgi->WriteHTMLBody(strTemp);
m-user.Close();
if(!strReferer.IsEmpty())
//设置回到主页的锚点。
{
cgi->WriteHTMLBody("<P>Go<A HREF="");
cgi->WriteHTMLBody(strReferer);
cgi->WriteHTMLBody("">Back</A>where you came from.</P>1512");
}
if(!strWebmaster.IsEmpty())
//设置Server管理者的E-mail地址。
{
cgi->WriteHTMLBody("<P>Please email comments to");
cgi->WriteHTMLBody("<A HREF="mailto:");
cgi->WriteHTMLBody(strWebmaster);
cgi->WriteHTMLBody("">");
cgi->WriteHTMLBody(strWebmaster);
cgi->WriteHTMLBody("</A>.</P>1512");
}
cgi->WriteHTMLBody("</BODY>1512");
cgi->WriteHTMLFooter();
}

4.结论
     将程序编译后,把wincgi.exe拷入website/cgi-win/目录下,用阅读器查询结果。至此简单地论述了用VC++编写Win CGI程序的全体历程,C程序员也可以用自己熟识的语言编写CGI程序了。应用VC++的强大功效,你的WWW Server将无所不能。

原创粉丝点击