接上篇,这次做了小小的改动和提升。增加了对POST的支持和对其他方法(GET和POST之外的)选择405回复。另外,增加了对CGI的支持,目前可以使用C语言来写(是不是好蠢的赶脚)。相对于上篇,整体做了小小的优化。这次代码就只贴mod_cgi.bas的部分,其他文件我打包了,感兴趣的同学可以下来看看。

注:由于我不是很了解WebServer,写这个东西也是盲人摸象。像什么状态控制、任务调度、容错之类的基本上能省则省,另外也是因为不会写,哈哈。如果有不足之处,还请不吝赐教,右路西裤(霓虹语:请多多指教)!

 'mod_cgi.bas
'code by lichmama from cnblogs.com
'CGI支持状态
Public CGI_ENABLED As Boolean
'CGI程序目录
Public Const CGI_ROOT As String = "c:\cgi-bin\" Private Declare Function CreatePipe Lib "kernel32" ( _
phReadPipe As Long, _
phWritePipe As Long, _
lpPipeAttributes As SECURITY_ATTRIBUTES, _
ByVal nSize As Long) As Long Private Declare Sub GetStartupInfo Lib "kernel32" Alias "GetStartupInfoA" ( _
lpStartupInfo As STARTUPINFO) Private Declare Function CreateProcess Lib "kernel32" Alias "CreateProcessA" ( _
ByVal lpApplicationName As String, _
ByVal lpCommandLine As String, _
lpProcessAttributes As Any, _
lpThreadAttributes As Any, _
ByVal bInheritHandles As Boolean, _
ByVal dwCreationFlags As Long, _
lpEnvironment As Any, _
ByVal lpCurrentDriectory As String, _
lpStartupInfo As STARTUPINFO, _
lpProcessInformation As PROCESS_INFORMATION) As Long Private Declare Function ReadFile Lib "kernel32" ( _
ByVal hFile As Long, _
lpBuffer As Any, _
ByVal nNumberOfBytesToRead As Long, _
lpNumberOfBytesRead As Long, _
lpOverlapped As Any) As Long Private Declare Function CloseHandle Lib "kernel32" ( _
ByVal hObject As Long) As Long Private Type SECURITY_ATTRIBUTES
nLength As Long
lpSecurityDescriptor As Long
bInheritHandle As Long
End Type Private Type PROCESS_INFORMATION
hProcess As Long
hThread As Long
dwProcessId As Long
dwThreadId As Long
End Type Private Type STARTUPINFO
cb As Long
lpReserved As Long
lpDesktop As Long
lpTitle As Long
dwX As Long
dwY As Long
dwXSize As Long
dwYSize As Long
dwXCountChars As Long
dwYCountChars As Long
dwFillAttribute As Long
dwFlags As Long
wShowWindow As Integer
cbReserved2 As Integer
lpReserved2 As Byte
hStdInput As Long
hStdOutput As Long
hStdError As Long
End Type Private Type OVERLAPPED
ternal As Long
ternalHigh As Long
offset As Long
OffsetHigh As Long
hEvent As Long
End Type Private Const STARTF_USESHOWWINDOW = &H1
Private Const STARTF_USESTDHANDLES = &H100
Private Const SW_HIDE =
Private Declare Sub RtlZeroMemory Lib "kernel32" (dest As Any, ByVal _
numBytes As Long) Public Function ShellCGI(ByVal head As Object, rep_state As Long) As String
Dim sa As SECURITY_ATTRIBUTES
Dim si As STARTUPINFO
Dim pi As PROCESS_INFORMATION
Dim hrp As Long
Dim hwp As Long
Dim ret As Long
Dim envstr As String 'fill this with CGI standard envrionment strings,
' which delimited by chr(0)
envstr = MakeEnvString(head)
Call RtlZeroMemory(ByVal VarPtr(sa), Len(sa))
Call RtlZeroMemory(ByVal VarPtr(si), Len(si))
Call RtlZeroMemory(ByVal VarPtr(pi), Len(pi)) sa.nLength = Len(sa)
sa.lpSecurityDescriptor = &
sa.bInheritHandle = & 'create pipe
ret = CreatePipe(hrp, hwp, sa, &)
If ret = Then
Debug.Print "[HTTP-VBS]: CGI Exception, pipe failed"
Exit Function
End If si.cb = Len(si)
si.hStdOutput = hwp
si.hStdError = hwp
si.dwFlags = STARTF_USESHOWWINDOW Or STARTF_USESTDHANDLES
si.wShowWindow = SW_HIDE 'create the cgi-process, cgi-path: head("Path_Translated")
ret = CreateProcess(head("Path_Translated"), vbNullString, _
ByVal &, ByVal &, True, &, ByVal envstr, vbNullString, si, pi)
If ret = Then
Debug.Print "[HTTP-VBS]: CGI Exception, create process failed"
Exit Function
End If 'read response from cgi
Dim nobr As Long 'num of bytes read
Dim lpbuff As String
Dim szbuff( * ) As Byte
Dim sum As Long
sum =
Call RtlZeroMemory(ByVal VarPtr(szbuff()), * )
Do
nobr = &
lpbuff = String(, " ")
If ReadFile(hrp, ByVal lpbuff, &, nobr, ByVal &) Then
Call RtlMoveMemory(ByVal VarPtr(szbuff(sum)), ByVal StrPtr(lpbuff), LenB(lpbuff))
sum = sum + LenB(lpbuff)
Else
Exit Do
End If
Call CloseHandle(hwp)
Loop
Call CloseHandle(hrp) rep_state =
ShellCGI = Left(szbuff, sum)
End Function Private Function MakeEnvString(ByVal head As Object) As String
MakeEnvString = "REQUEST_METHOD=" & head("Request")("Method") & Chr() & _
"CONTENT_TYPE=" & head("Content-Type") & Chr() & _
"CONTENT_LENGTH=" & head("Content-Length") & Chr() & _
"QUERY_STRING=" & head("Query_String") & Chr() & _
"SCRIPT_NAME=" & head("Script_Name") & Chr() & _
"PATH_INFO=" & head("Path_Info") & Chr() & _
"PATH_TRANSLATED=" & head("Path_Translated") & Chr() & _
"REMOTE_HOST=" & head("Remote_Host") & Chr() & _
"REMOTE_ADDR=" & head("Remote_Addr") & Chr() & _
"REMOTE_PORT=" & head("Remote_Port") & Chr() & _
"REMOTE_USER=" & head("Remote_User") & Chr() & _
"REMOTE_IDENT=" & head("Remote_Ident") & Chr() & _
"AUTH_TYPE=" & head("Auth_Type") & Chr() & _
"SERVER_NAME=http-vb/0.1" & Chr() & _
"SERVER_PORT=80" & Chr() & _
"SERVER_PROTOCOL=HTTP/1.1" & Chr() & _
"DOCUMENT_ROOT=" & head("Document_Root") & Chr() & _
"SERVER_SOFTWARE=http-vb/0.1 vb/6.0" & Chr() & _
"HTTP_ACCEPT=" & head("Accept") & Chr() & _
"HTTP_USER_AGENT=" & head("User-Agent") & Chr() & _
"HTTP_REFERER=" & head("Referer") & Chr() & _
"HTTP_COOKIE=" & head("Cookie") & Chr() & _
"GATEWAY_INTERFACE=CGI/1.1" & Chr()
End Function

CGI的代码:

 #include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#define ENV_MAX_LENGTH 0x7fff char *GetEnv(const char *lpName, char *lpbuff){
memset(lpbuff, , ENV_MAX_LENGTH);
GetEnvironmentVariable(lpName, lpbuff, ENV_MAX_LENGTH);
return lpbuff;
} int main(int argc, char *argv[]){
char lpbuff[ENV_MAX_LENGTH]={};
printf("Content-Type: text/html; charset=utf-8\n");
printf("\n");
printf("<html>\n");
printf("<head>\n");
printf("<meta content='text/html; charset=utf-8' http-equiv='content-type' />\n");
printf("<title>cgi page@lichmama</title>\n");
printf("</head>\n");
printf("<body>\n");
printf("<ul style='font-family:courier new'>\n");
printf("<li>REQUEST_METHOD: %s</li>\n", GetEnv("REQUEST_METHOD", lpbuff));
printf("<li>CONTENT_TYPE: %s</li>\n", GetEnv("CONTENT_TYPE", lpbuff));
printf("<li>CONTENT_LENGTH: %s</li>\n", GetEnv("CONTENT_LENGTH", lpbuff));
printf("<li>QUERY_STRING: %s</li>\n", GetEnv("QUERY_STRING", lpbuff));
printf("<li>SCRIPT_NAME: %s</li>\n", GetEnv("SCRIPT_NAME", lpbuff));
printf("<li>PATH_INFO: %s</li>\n", GetEnv("PATH_INFO", lpbuff));
printf("<li>PATH_TRANSLATED: %s</li>\n",GetEnv("PATH_TRANSLATED", lpbuff));
printf("<li>REMOTE_HOST: %s</li>\n", GetEnv("REMOTE_HOST", lpbuff));
printf("<li>REMOTE_ADDR: %s</li>\n", GetEnv("REMOTE_ADDR", lpbuff));
printf("<li>REMOTE_PORT: %s</li>\n", GetEnv("REMOTE_PORT", lpbuff));
printf("<li>REMOTE_USER: %s</li>\n", GetEnv("REMOTE_USER", lpbuff));
printf("<li>REMOTE_IDENT: %s</li>\n", GetEnv("REMOTE_IDENT", lpbuff));
printf("<li>AUTH_TYPE: %s</li>\n", GetEnv("AUTH_TYPE", lpbuff));
printf("<li>GATEWAY_INTERFACE: %s</li>\n", GetEnv("GATEWAY_INTERFACE", lpbuff));
printf("<li>SERVER_NAME: %s</li>\n", GetEnv("SERVER_NAME", lpbuff));
printf("<li>SERVER_PORT: %s</li>\n", GetEnv("SERVER_PORT", lpbuff));
printf("<li>SERVER_PROTOCOL: %s</li>\n",GetEnv("SERVER_PROTOCOL", lpbuff));
printf("<li>DOCUMENT_ROOT: %s</li>\n", GetEnv("DOCUMENT_ROOT", lpbuff));
printf("<li>SERVER_SOFTWARE: %s</li>\n",GetEnv("SERVER_SOFTWARE", lpbuff));
printf("<li>HTTP_ACCEPT: %s</li>\n", GetEnv("HTTP_ACCEPT", lpbuff));
printf("<li>HTTP_USER_AGENT: %s</li>\n",GetEnv("HTTP_USER_AGENT", lpbuff));
printf("<li>HTTP_REFERER: %s</li>\n", GetEnv("HTTP_REFERER", lpbuff));
printf("<li>HTTP_COOKIE: %s</li>\n", GetEnv("HTTP_COOKIE", lpbuff));
printf("</ul>\n");
printf("</body>\n");
printf("</html>\n");
return ;
}

贴张图,看看效果(看到.exe会不会觉得邪恶):

咦,怎么添加附件?先来个百度云盘吧。

VB6之HTTP服务器的实现(二)的更多相关文章

  1. Python 创建本地服务器环境生成二维码

    一. 需求 公司要做一个H5手机端适配页面,因技术问题所以H5是外包的,每次前端给我们源码,我们把源码传到服务器让其他人访问看是否存在bug,这个不是很麻烦吗?有人说,可以让前端在他们的服务器上先托管 ...

  2. Citrix 服务器虚拟化之二十一 桌面虚拟化之部署Provisioning Services

    Citrix 服务器虚拟化之二十一  桌面虚拟化之部署Provisioning Services Provisioning Services 是Citrix 出品的一系列虚拟化产品中最核心的一个组件, ...

  3. Citrix 服务器虚拟化之二十八 XenApp6.5发布文档内容

    Citrix 服务器虚拟化之二十八  XenApp 6.5发布文档内容 XenApp可发布以下类型的资源向用户提供信息访问,这些资源可在服务器或桌面上虚拟化: 1)  服务器桌面:发布场中服务器的整个 ...

  4. Citrix 服务器虚拟化之二十七 XenApp6.5发布服务器桌面

    Citrix 服务器虚拟化之二十七  XenApp6.5发布服务器桌面 XenApp可发布以下类型的资源向用户提供信息访问,这些资源可在服务器或桌面上虚拟化: 1)  服务器桌面:发布场中服务器的整个 ...

  5. VMware vSphere 服务器虚拟化之二十五 桌面虚拟化之终端服务池

    VMware vSphere 服务器虚拟化之二十五 桌面虚拟化之终端服务池 终端服务池是指由一台或多台微软终端服务器提供服务的桌面源组成的池.终端服务器桌面源可交付多个桌面.它具有以下特征: 1.终端 ...

  6. Citrix 服务器虚拟化之二 Xenserver加域管理

    Citrix 服务器虚拟化之二   Xenserver加域管理 如果要使用多个用户和用户组来管理XenServer服务器,就必须使用 Active Directory 用户账户进行身份验证.XenSe ...

  7. VMware vSphere 服务器虚拟化之二十二桌面虚拟化之创建View Composer链接克隆的虚拟桌面池

    VMware vSphere 服务器虚拟化之二十二桌面虚拟化之创建View Composer链接克隆的虚拟桌面池 在上一节我们创建了完整克隆的自动专有桌面池,在创建过程比较缓慢,这次我们将学习创建Vi ...

  8. VMware vSphere 服务器虚拟化之二十八 桌面虚拟化之安装View传输服务器

    VMware vSphere 服务器虚拟化之二十八 桌面虚拟化之安装View传输服务器 View 传输服务器用于管理和简化数据中心与在最终用户本地系统上检出使用的 View 桌面之间的数据传输.必须安 ...

  9. VMware vSphere 服务器虚拟化之二十七桌面虚拟化之View中使用Thinapp软件虚拟化

    VMware vSphere 服务器虚拟化之二十七桌面虚拟化之View中使用Thinapp软件虚拟化 VMware ThinApp 应用程序虚拟化软件是无代理解决方案,通过将应用程序隔离并封装为EXE ...

随机推荐

  1. 使用 jQuery.Pin 垂直滚动时固定导航

    ZKEACMS的导航默认是不能固定的,随着页面的滚动而滚动,为了有更好的用户体验,当页面往下滚动时,可以将导航固定在顶端,这样方便用户点击. jQuery Pin 借助jQuery的一个插件 jQue ...

  2. SimpleDateFormat使用和线程安全问题

    SimpleDateFormat 是一个以国别敏感的方式格式化和分析数据的具体类. 它允许格式化 (date -> text).语法分析 (text -> date)和标准化. Simpl ...

  3. unity 在安卓个IOS平台上 同一个按钮 点击后实现不同的功能

    #if UNITY_IOS UIEventListener.Get(mSprites["Recharge"].gameObject).onClick = OnIOSRecharge ...

  4. 卫星导航低噪声放大器芯片(LNA)-AT2659

    AT2659 是一款专门针对中国 BDS(北斗卫星导航系统),美国的 GPS,俄罗斯的 GLONASS 和欧盟的 GALILEO 导航系统应用而设计的高增益.低噪声系数射频放大器.  AT2659 芯 ...

  5. SmartCoder每日站立会议07

    站立会议内容     基本框架已出,首页地图功能还没有接入完全. 1.站立会议照片: 2.任务展板 3.燃尽图

  6. 无声的吐槽csdn

    上次朋友聚会,说csdn挺好的,我琢磨着,那好我也去注册一个.经过n次的注册(用户名那边老是验证不过,不给中文开头,然后随便填了一个),终于搞定了! 我想,不错啊,做了这么多限制,挺安全的感觉.然后我 ...

  7. Java解析word文档

    背景 在互联网教育行业,做内容相关的项目经常碰到的一个问题就是如何解析word文档. 因为系统如果无法智能的解析word,那么就只能通过其他方式手动录入word内容,效率低下,而且人工成本和录入出错率 ...

  8. 读书笔记-你不知道的JavaScript(上)

    本文首发在我的个人博客:http://muyunyun.cn/ <你不知道的JavaScript>系列丛书给出了很多颠覆以往对JavaScript认知的点, 读完上卷,受益匪浅,于是对其精 ...

  9. SqlDataReader 之指定转换无效

    //获取最新显示顺序数据 string str = string.Format(@"if exists(select ShowOrder from GIS_FuncDefaultLayer ...

  10. (转)C++——std::string类的引用计数

    1.概念 Scott Meyers在<More Effective C++>中举了个例子,不知你是否还记得?在你还在上学的时候,你的父母要你不要看电视,而去复习功课,于是你把自己关在房间里 ...