接上篇,这次做了小小的改动和提升。增加了对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. 这 5 个前端组件库,可以让你放弃 jQuery UI

    欢迎大家持续关注葡萄城控件技术团队博客,更多更好的原创文章尽在这里~~ 在建立Web应用时,通常都需要用到一些有用的UI组件.无论应用中需要的是日历,滑块,图形或其它用于提升或简化用户交互的组件,那么 ...

  2. php实现题目抢答、商品秒杀等类型的需求

    最近和其他部门合作项目,当然我是负责php接口方面的工作,get到一些东西,所以来分享记录一下. 项目需求: 题目将通过主持人ipad投射至大屏幕,选手按'抢答'按钮进行抢答.抢答成功,选手所在组,以 ...

  3. Linux盘符绑定槽位

    服务器下的硬盘主有机械硬盘.固态硬盘以及raid阵列,通常内核分配盘符的顺序是/dev/sda./dev/sdb- -.在系统启动过程中,内核会按照扫描到硬盘的顺序分配盘符(先分配直通的,再分配阵列) ...

  4. Ajax请求汇总(一)

    刚开始结束Ajax请求的时候,那真的是迷迷糊糊,昏天暗地,通过学习的深入和翻阅各种资料.求助度娘,总结一下Ajax请求,与大家分享一下,希望能给学习Ajax的同学一些帮助,废话不多手,直接开始~~~ ...

  5. 【JAVAWEB学习笔记】网上商城实战:环境搭建和完成用户模块

    网上商城实战 今日任务 完成用户模块的功能 1.1      网上商城的实战: 1.1.1    演示网上商城的功能: 1.1.2    制作目的: 灵活运用所学知识完成商城实战. 1.1.3    ...

  6. makefile介绍1.0

    1.gcc参数 -o指定生成文件名 -c只编译不链接 2.makefile标准格式 CC=gcc #编译器变量,#代表注释 SRCS=main.cpp\#源文件变量 a.cpp\ b.cpp\ c.c ...

  7. pick off your glasses

    我一直在想,为什么带眼镜时间长了机不愿意再摘下来呢,或者说摘下来感觉很不舒服.当然了,这更多的是内心里的一种感觉而已. 其实,我突然认为这是一种不自信,在这样一个物欲横流的社会中,当你眼前模模糊糊,而 ...

  8. Java IO流之文件流

    一.文件流分类 二.FileInputStream 三.FileOutputStream 四.FileReader 五.FileWriter 六.文件流应用 1,复制或剪切文件 2,读取文件信息 应用 ...

  9. [转]tomcat部署

    转载博客原文地址:  http://www.cnblogs.com/xing901022/p/4463896.html 阅读目录 介绍 静态部署——在tomcat启动时部署 动态部署——在tomcat ...

  10. mybatis批量增、删、改(更新)操作oracle和mysql批量写法小记

    前言:用mybatis也好几年了,mybatis在批量的增删操作也写起来也是比较简单的,只有批量更新这一块是特别坑,特此记录. 注:本文主要用来记录oracle和mysql数据库在使用mybatis的 ...