IIS CGI配置和CGI程序FreeBasic, VB6, VC 简单样例

如果说COM和DLL让程序间交互数据变得方便,那CGI这门简单而又古老的技术让网络上数据交互变得方便。虽然古老,但浩瀚的互联网上和世界各地的企业内部,仍有许许多多并发访问量不大的业务在使用这门技术。今天做个回顾,并列出一些例子做些说明。

  • 首先在控制面板程序功能中打开IIS的服务,打勾IIS中的服务(附CGI外其它的也打开吧,以后会用到),CSDN上有许多文章介绍,细节略过。下面是WIN10的IIS配置

  • 打到管理工具,点击进去。

  • 配置后IIS概览

注意事项:

创建站点的内容CSDN比较丰富,细节从略,就注意事啰嗦几句。

1. 物理路径的访问权限,可以在WINDOWS系统的用户管理中进行授权管理,或是直接在文件夹中设置权限,总之要有访问物理路径的权限。

2. 创站点时连接为这地方点进去,不妨用登录计算机的账号和密码连接,因为这个账号肯定是有权限的,大多情况下它是管理员账号。

3. 创了站点会遇到启动后应用池中站点就用图标多个小方块停止了,再启动又停止。这个时候设置一下标识到 LocalService ,还有一种情况是创站点时的端口号不要用默认的80,用其它未使用的,否则它也会停止。

  • 在保证站点正常运行情况下配置CGI,请求路径是 *.cgi, 模块下拉点选 CgiMoudle,名称保持与前面一致 cgi-bin,主要是为了以后好对比查找它。

支持CGI的站点到这步就创建好了。关键的坑过去了,其它的多折腾几次就熟悉了,IIS这东西MS系开发时发布和测试会用的。下面是要放到cgi-bin目录下的样例。

1. VC CGI样例。VC6的C++,使用cout标准输出。若是c的话,注释掉 cout,去年 printf 的注释。

#include "stdafx.h"
#include "iostream.h"

int main(int argc, char* argv[])
{
	cout << "Content-type:text/html\n\n" << endl;
	cout << "<HTML><HEAD><TITLE>" << endl;
	cout << "Friends CGI Demo (dynamic screen)" << endl;
	cout << "</TITLE></HEAD>" << endl;
	cout << "<BODY>" << endl;
	cout << "<P><B>Hello World From MFC</B></P>" << endl;
	cout << "</BODY></HTML>" << endl;

/*
	printf("Content-type:text/html\n\n");
	printf("<HTML><HEAD><TITLE>");
	printf("Friends CGI Demo (dynamic screen)");
	printf("</TITLE></HEAD>");
	printf("<BODY>");
	printf("<P><B>Hello World From MFC</B></P>");
	printf("</BODY></HTML>");
*/
	return 0;
}

编译成exe然后改扩展名为 cgi 放到 cgi-bin 文件下。在浏览中输入 http://本机地址:端口/cgi-bin/cgi程序.cgi 执行,结果到屏幕上了。

2. FreeBasic CGI样例。新建控制台项目

   print "Content-Type: text/html" & vbCrLf
   Print "<head>" & vbCrLf
   print "<title>Hello World</title>" & vbCrLf
   print "<meta charset='utf-8'>" & vbCrLf
   print "</head>" & vbCrLf
   print "<body>" & vbCrLf
   print "<h2>Hello World, CGI!</h2>" & vbCrLf
   print "</body>" & vbCrLf
   Print "</html>" & vbCrLf

编译后改扩展名为 cgi,放到cgi-bin下。访问后的回应结果这下面的样子。

3. VB6写CGI程序。VB6情况相对其它语言复杂些,它隐藏了stdin和stdout,要api来取得Stdin和Stdout的handle进行操作,其它高级语言估计也会存在类似情况。方法:创建标准exe程序,移除默认的form1,然后添加 hello.bas 模块,下面是模块中的内容是ms建议的。

Option Explicit

Public Const STD_INPUT_HANDLE = -10&
Public Const STD_OUTPUT_HANDLE = -11&

Public Const CGI_AUTH_TYPE As String = "AUTH_TYPE"
Public Const CGI_CONTENT_LENGTH As String = "CONTENT_LENGTH"
Public Const CGI_CONTENT_TYPE As String = "CONTENT_TYPE"
Public Const CGI_GATEWAY_INTERFACE As String = "GATEWAY_INTERFACE"
Public Const CGI_HTTP_ACCEPT As String = "HTTP_ACCEPT"
Public Const CGI_HTTP_REFERER As String = "HTTP_REFERER"
Public Const CGI_HTTP_USER_AGENT As String = "HTTP_USER_AGENT"
Public Const CGI_PATH_INFO As String = "PATH_INFO"
Public Const CGI_PATH_TRANSLATED As String = "PATH_TRANSLATED"
Public Const CGI_QUERY_STRING As String = "QUERY_STRING"
Public Const CGI_REMOTE_ADDR As String = "REMOTE_ADDR"
Public Const CGI_REMOTE_HOST As String = "REMOTE_HOST"
Public Const CGI_REMOTE_USER As String = "REMOTE_USER"
Public Const CGI_REQUEST_METHOD As String = "REQUEST_METHOD"
Public Const CGI_SCRIPT_NAME As String = "SCRIPT_NAME"
Public Const CGI_SERVER_NAME As String = "SERVER_NAME"
Public Const CGI_SERVER_PORT As String = "SERVER_PORT"
Public Const CGI_SERVER_PROTOCOL As String = "SERVER_PROTOCOL"
Public Const CGI_SERVER_SOFTWARE As String = "SERVER_SOFTWARE"

Public Declare Function Sleep Lib "kernel32" _
(ByVal dwMilliseconds As Long) As Long

Public Declare Function stdin Lib "kernel32" Alias "GetStdHandle" _
(Optional ByVal Handletype As Long = STD_INPUT_HANDLE) As Long

Public Declare Function stdout Lib "kernel32" Alias "GetStdHandle" _
(Optional ByVal Handletype As Long = STD_OUTPUT_HANDLE) As Long

Public Declare Function ReadFile Lib "kernel32" _
(ByVal hFile As Long, ByVal lpBuffer As Any, ByVal nNumberOfBytesToRead As Long, _
lpNumberOfBytesRead As Long, Optional ByVal lpOverlapped As Long = 0&) As Long

Public Declare Function WriteFile Lib "kernel32" _
(ByVal hFile As Long, ByVal lpBuffer As Any, ByVal nNumberOfBytesToWrite As Long, _
lpNumberOfBytesWritten As Long, Optional ByVal lpOverlapped As Long = 0&) As Long

Sub Main()

    Dim sReadBuffer As String
    Dim sWriteBuffer As String
    Dim lBytesRead As Long
    Dim lBytesWritten As Long
    Dim hStdIn As Long
    Dim hStdOut As Long
    Dim iPos As Integer

    ' sleep for one minute so the debugger can attach and set a break
    ' point on line below
    ' Sleep 60000

    sReadBuffer = String$(CLng(Environ$(CGI_CONTENT_LENGTH)), 0) ' Get STDIN handle
    hStdIn = stdin() ' Read client's input
    ReadFile hStdIn, sReadBuffer, Len(sReadBuffer), lBytesRead

    ' Find '=' in the name/value pair and parse the buffer
    iPos = InStr(sReadBuffer, "=")
    sReadBuffer = Mid$(sReadBuffer, iPos + 1) ' Construct and send response to the client
    sWriteBuffer = "HTTP/1.0 200 OK" & vbCrLf & "Content-Type: text/html" & _
    vbCrLf & vbCrLf & "Hello from VisualBasic6"
    hStdOut = stdout()
    WriteFile hStdOut, sWriteBuffer, Len(sWriteBuffer) + 1, lBytesWritten
    WriteFile hStdOut, sReadBuffer, Len(sReadBuffer), lBytesWritten

End Sub

编译成exe,改扩展名为 cgi,放到cgi-bin下。结果如下。

有了样例,可以方便对配置完好性的验证。这东西蛋糕店、鲜花店,做个推广下个定单之类的还行,小车间、工厂做个材料查询也行。现在时兴上云,这东西未来还能做点啥用呢?在此做个回顾吧,也算走过了遇过了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值