分享
 
 
 

用VC++编写CGI程序

王朝vc·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

用VC++编写CGI程序

浙江大学生命科学与医学工程学系 徐晨勇 段会龙 吕维雪

摘 要 该文通过对CGI程序,特别是Windows CGI程序原理的分析,介绍了用Visual C+ +语言编写CGI程序的方法,并给出了一个用CGI程序使得WWW服务器与系统数据库相连的例子。

关键词 CGI WWW HTML VC++ 数据库

近年来,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:\WebSite\cgi-temp\198ws.out//输出文件的路径名。

Content File=c:\WebSite\cgi-temp\198ws.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>\015\012");

cgi->WriteHTMLBody("<BODY>\015\012");

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>\015\012";

cgi->WriteHTMLBody(strTemp);

strTemp="<P>入网费:"+m-user-FARE-INI+".</P>\015\012";

cgi->WriteHTMLBody(strTemp);

……

strTemp="<P>通信费:"+m-user.m-FARE-COM+".</P>\015\012"

;

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>\015\012");

}

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>\015\012");

}

cgi->WriteHTMLBody("</BODY>\015\012");

cgi->WriteHTMLFooter();

}

4.结论

将程序编译后,把wincgi.exe拷入website/cgi-win/目录下,用浏览器查询结果。至此简单地阐述了用VC++编写Win CGI程序的整个过程,C程序员也可以用自己熟悉的语言编写CGI程序了。利用VC++的强大功能,你的WWW Server将无所不能。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有