电信主站 网通分站
购买流程 付款方式 常见问题 在线提问 续租服务 购物车
用户名: 密 码: 忘记密码?
首 页
域名注册
虚拟主机
双线主机
服务器租用
VPS主机
企业邮局
代理专区
客服中心
虚拟主机行业资讯 虚拟主机评测对比 互联网最新动态 技术学院 站长资讯 在线教程 网站运营
搜索优化 服务器 网络编程 图形图象 站长之家 网页制作 操作系统
冲浪宝典 软件教学 视频通信 办公软件 邮件系统 网络安全 认证考试
您当前位置:西部数码->资讯中心-> 网络编程 -> PHP教程
用vb编写标准cgi程序(上)_visualbasic教程
作者:网友供稿 点击:0
  西部数码-全国虚拟主机10强!20余项虚拟主机管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!虚拟主机可在线rar解压,自动数据恢复设置虚拟目录等.虚拟主机免费赠送访问统计,企业邮局.Cn域名注册10元/年,自助建站480元起,免费试用7天,满意再付款!P4主机租用799元/月.月付免压金!
文章页数:[1] 
利用通用网关接口(CGI) Web服务器可以执行一些外部程序 并将这些外部程序所产生的输出结果和Web服务器所管理的静态文本 图像和声音融合在一起传给相应的Web浏览器。当客户机的浏览器向Web服务器请求一个HTML文件时 服务器在收到请求后就去寻找这个文件并将找到的文件传送给客户机。而当客户机的请求是一个CGI程序时 Web服务器将激活客户机所请求的CGI程序并把程序的执行结果传给客户机。

  标准的CGI程序是通过环境变量和标准输入输出来与Web服务器交换信息的。任何一个被系统激活的进程都拥有标准输入和输出这两个文件句柄 CGI程序的进程也不例外。不过 当CGI程序被Web服务器激活以后 它的标准输入STDIN被连接到Web服务器的标准输出STDOUT上 而CGI程序的标准输出STDOUT则被连到服务器的标准输入STDIN上。因此 CGI程序从标准输入读取信息(也就是从Web服务器的标准输出读信息) 而它向标准输出写信息(也就是向Web服务器的标准输入写信息)。

  Web服务器一般将客户机传送来的信息放在它的标准输出和相关环境变量中 而CGI程序则从环境变量和它的标准输入(也就是Web服务器的标准输出)获取所需的信息 程序的最终输出结果则被写向它的标准输出STDOUT(也就是Web服务器的标准输入)。Web服务器将从它的标准输入STDIN(也就是CGI程序的标准输出)获取CGI程序的输出结果并将它传送给客户机。客户机 Web服务器和CGI程序之间的信息交流如下图所示。显然 Web服务器就像是客户机和CGI程序间的中介。

  Web服务器 CGI程序间的这种标准框架在Unix系统下和微软Windows环境中的字符方式下可以工作得非常好 因为此时系统产生的所有进程都可以存取标准输入和标准输出。但对于微软Windows图形方式下的程序就不行了 因为它们无法存取标准输入和标准输出。为了解决这一问题 微软在Win32系统中创建了另一类型的标准输入和标准输出 程序可以通过调用Win32API函数来存取标准输入和标准输出 不过 这就意味著使用这类标准输入和标准输出的CGI程序都必须是32位的。

  微软Windows环境下的其它一些Web服务器(例如Website)则使用另外一种特殊的技术(即利用INI文件)来实现Web服务器和CGI程序间的数据交流。采用这种被称为“Win-CGI”规范编写的CGI程序通常只能在部份Web服务器上运行。一般地 支持Win-CGI的Web服务器将客户端的输入以及有关的状态信息写入到一个INI文件中 而CGI程序则从该INI文件中获取相关信息 这类程序的执行效率没有标准CGI程序高。

  在进行CGI编程时 只要使CGI程序从标准输入和环境变量中获取客户机提供的信息 并将要传送给客户机的输出结果写入标准输出 剩下的信息传递工作将由Web服务器自动完成。CGI只是规定了一个标准的接口规范 只要遵守这个标准规范 程序开发人员就可以利用各种编程工具(如Perl C FORTRAN VisualBasic等)进行CGI编程了。考虑到VisualBasic的强大的数据库处理能力 客户机/服务器模式的编程能力以及字符串处理能力 所以本文主要向大家介绍如何使用VB编写标准的CGI程序。

  一 输入输出的处理

  一个CGI程序被激活以后 它首先要做的事情就是确定系统平台 Web服务器和客户端浏览器的状态信息以及客户端用户的输入数据。此外 它还必须能够将相关信息传送给客户端 否则它将一事无成。这些操作都是通过存取环境变量和标准输入输出来完成的。用VB编写的CGI程序通过调用函数Environ()来获取相关环境变量的值。存取标准输入输出就要在程序中使用Win32API函数GetStdHandle() ReadFile()和WriteFile() 在使用这些函数时首先必须在程序中声明它们 写声明语句时可以借助于VB提供的API文本查看器。

  以下的CGI程序说明 在VB-CGI程序中如何处理环境变量和标准输入输出。该CGI程序非常简单 可将标准输入中的信息不经任何处理就返回给客户端 它可被任何表单用POST方法激活 

  DeclareFunctionGetStdHandleLib"kernel32"(ByValnStdHandleAsLong)AsLong

  DeclareFunctionReadFileLib"kernel32"(ByValhFileAsLong,lpBufferAsAny,

  ByValnNumberOfBytesToReadAsLong,lpNumberOfBytesReadAsLong,lpOverlappedAsAny)AsLong

  DeclareFunctionWriteFileLib"kernel32"(ByValhFileAsLong,ByVallpBufferAsString,ByValnNumberOfBytesToWriteAsLong,lpNumberOfBytesWrittenAsLong,lpOverlappedAsAny)AsLong

  PublicConstSTD_INPUT_HANDLE=-10&

  PublicConstSTD_OUTPUT_HANDLE=-11&

  PublicConstFILE_BEGIN=0&

  PublichStdInAsLong标准输入文件句柄

  PublichStdOutAsLong标准输出文件句柄



  SubMain()

  DimCGI_ContentLengthAsString CGI_QueryStringAsString

  DimlContentLengthAsLong标准输入中的字符串的长度

  DimsBuffAsString用于存储标准输入中的字符串

  DimlBytesReadAsLong实际读入的字符个数

  DimrcAsLong

  DimsFormDataAsString

  调用系统函数生成标准输入输出文件句柄

  hStdIn=GetStdHandle(STD_INPUT_HANDLE)

  hStdOut=GetStdHandle(STD_OUTPUT_HANDLE)

  获取环境变量CONTENT_LENGTH的值 并将它转换为整型

  CGI_ContentLength=Environ("CONTENT_LENGTH")

  lContentLength=Val(CGI_ContentLength)

  sBuff=String(lContentLength,Chr$(0))

  从标准输入中读数据

  rc=ReadFile(hStdIn,ByValsBuff,lContentLength,lBytesRead,ByVal0&)

  sFormData=Left$(sBuff,lBytesRead)

  OutPut"Content-type:text/html"&vbCrLf

  OutPut"<HTML><HEAD>"

  OutPut"<TITLE>表单传送数据的方法POST</TITLE></HEAD>"

  OutPut"<BODY><H3>表单传送数据的方法POST</H3>"

  OutPut"<P>本CGI程序使用VisualBasic编制 "

  OutPut"<P>POST方法传送的数据:"

  OutPut"<P>"&sBuff

  OutPut"</BODY></HTML>"

  EndSub

  SubOutPut(sAsString)定义一个向标准输出写信息的函数

  DimlBytesWrittenAsLong

  s=s&vbCrLf

  WriteFilehStdOut,s,Len(s),lBytesWritten,ByVal0&

  EndSub

  一般地 用VB编译生成的CGI程序不能正确处理中文信息。这主要表现在CGI程序向STDOUT输出的中文在Web页面上无法正确显示 可通过在该中文字符串后跟著输出一些空格来解决这个问题。当使用HTML标识符<P> </P>对Web页面进行排版时 浏览器在显示该Web页面时会吃掉多馀的空格而只保留一个。在这种情况下 这些空格对Web页面的外观基本上没有什堋影响。如果使用HTML标识符<PRE> </PRE>对Web页面进行排版 则由于空格不能被浏览器吃掉 所以Web页面的外观将会受到较大的影响。不过 这时可用HTML的表格<table> <P>来代替<PRE>对Web页面进行排版。

  注意 整个CGI程序的主体必须放在MAIN()函数中。

  二 URL译码与解码

  由于Web服务器和浏览器不能正确处理一些特殊的字符 Web服务器和浏览器之间可能会因此而产生某种程度的误会 所以在数据被传送之前 浏览器都要对表单内客户输入的数据中的特殊字符进行URL译码。

  例如 Web系统用“=”分解表单各元素的NAME和VALUE属性 用“&”分解不同表单元素的输入数据。如果在表单的输入数据中包含这些特殊的字符 并且表单的数据在传送给Web服务器前不作任何处理 则Web服务器将无法知道哪一个“=” “&”是用户输入的 哪一个是浏览器加上的。在由表单属性ACTION定义的URL中 也可能会出现一些特殊的字符 当在CGI程序的名称和路径信息(PathInformation)中出现“=” “&”和“ ”时 都会影响数据的正确传送。

  URL译码(URLEncoding)就是将Web服务器所不能正确处理的特殊字符转换成它的十六进制数的形式 比如将“”转换成“%” “=”转换成“=”等等。这些特殊的字符通常被称作Web系统的保留字符。在Web系统上无论是用GET方法还是用POST方法传送的数据都要进行URL译码。CGI程序要想处理表单传送来的数据 还必须对浏览器URL译码过的数据进行解码。因此 理解URL译码对于我们进行CGI编程是非常重要的。URL译码一般包括以下步骤 

  1 浏览器将所传送的数据根据表单所包含的元素分解成“NAME=VALUE”形式 NAME和VALUE分别是表单元素的属性。其中 VALUE属性中存储客户机在表单中输入的数据 如果客户机没有输入数据 则VALUE存储的是表单定义的缺省值如果缺省值也没有定义 则VALUE值为空。

  2 代表表单中各元素的各个“NAME=VALUE”对被浏览器用“&”连接起来。

  3 VALUE属性中存放的数据若含有空格 则被转换成“ ”。

  4 URL和输入数据中所包含的Web系统的保留字符必须被译码成其十六进制数形式。

  5 被译码后的字符被表示成一个“”和它们的十六进制数形式(即HH)。

  CGI程序从环境变量“QUERY_STRING”或标准输入中读入的数据是经过浏览器URL译码过的 故在使用这些数据以前还必须对它们进行URL解码。解码的目的是将数据还原成客户端用户在Web页面上输入时的形式。本文已经介绍了URL译码过程 URL解码过程与它正好相反 它一般包括以下步骤 

  1 从浏览器用GET或POST方法所传送来的数据中找出代表各个表单元素所储存数据的“NAME=VALUE”对。

  2 VALUE属性中所存放的数据若含有“ ” 则被转换成空格。

  3 将VALUE属性中所存放的数据的十六进制数“HH”转换成相应的字符。

  Web系统将汉字当成特殊的字符 对它也要进行URL译码。对于一个特殊的单字节字符(比如“/”) 浏览器通常将它译码成十六进制数的形式(比如/) “”表示它后面跟的是两位十六进制数。当VB程序对其进行处理时调用Chr$函数就可以将其恢复为原貌。而一个汉字则被浏览器译码成四位十六进制数(比如张)。如果CGI程序还像以前那样分别调用Chr(D5)和Chr(C5) 则由于D5 C5都不是正常的单字节十六进制数码 故Chr函数返回空 汉字将无法正确还原。正确的做法应该是将有关汉字的四位十六进制数一起传给函数Chr(如Chr(D5C5)) 此时汉字才能被正确还原。

  因此 可以让CGI程序对四位连续的十六进制数一起进行译码 以便使汉字能够被正确还原。但在这种情况下 当客户端用户输入了两个连续的Web系统保留字符时 CGI程序又可能把它们当成汉字来处理。这时可以让CGI程序在 要对四位连续的十六进制数进行译码时首先检查前面两位是否为Web系统的保留字符 如果是则仍然按照单字节的字符处理。不过如果客户端用户在表单内填写了很多汉字 则CGI程序的负担将会大大加重。事实上 在大多数情况下 客户端用户很少会使用两个连续的Web系统的保留字符 所以可以只让CGI程序对最容易出现的情形如“://”(当客户端用户在表单中输入某一URL时会出现这种情况)进行检查 本文下节提供的函数UrlDecode()可以实现对汉字和Web系统保留字符的URL解码。->


文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!
相关主题
文章页数:[1] 
Google
热门文章
·php4实际应用经验篇(5)_php实例
·挑战最棒的留言本的源码(五)_php实例
·一个用mysql_odbc和php写的serach数据库程序_php实例
·一个简单计数器的源代码_php实例
·文件上传程序的全部源码_php实例
·计算2000年01月01日起到指定日的天数_php实例
·新闻分类录入、显示系统_php实例
·php4实际应用经验篇(1)_php实例
·php4实际应用经验篇(2)_php实例
·php4实际应用经验篇(3)_php实例

最新文章
·PHP3 入门教程(极短篇)---什么是 PHP ?
·PHP4.04在英文win2000下的安装
·实例学习 PHP 之表单处理篇(一)
·PHP4.04在win98下的安装
·PHP4.03在linux下的安装
·实例学习PHP之投票程序篇(二)
·实例学习PHP之投票程序篇(一)
·fireworks绘制炫彩光影缠绕dna图案_fireworks教程
·phpbb3跟网站结合,实现登入网站同时登入论坛_php技巧
·用photoshop“磨皮”和简单的人物处理技巧_photoshop教程


 
 


版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!

特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
  打印  刷新  关闭
返回首页 |关于我们 | 联系我们 | 付款方式 | 创业联盟 | 虚拟主机 | 资讯中心 | 友情链接 | 网站地图

版权所有 西部数码(www.west263.com)
CopyRight (c) 2002~2006 west263.com all right reserved.
公司地址:四川成都市万和路90号天象大厦4楼 邮编:610031
电话总机:028-86262244 86263048 86263408 86263960 86264018 86267838
售前咨询:总机转201 202 203 204 206 208
售后服务:总机转211 212 213 214
财务咨询:总机转224 223 传真:028-86264041 财务QQ:点击发送消息给对方635483282
售前咨询QQ:点击发送消息给对方2182518 点击发送消息给对方241975952 点击发送消息给对方275026793 点击发送消息给对方408235859
售后服务QQ:点击发送消息给对方17708515 点击发送消息给对方307742704 点击发送消息给对方287976517 点击发送消息给对方363783715
《中华人民共和国增值电信业务经营许可证》编号:川B2-20030065号