• VB6 制作 HTTP代理服务器


    Private Declare Function gethostbyname Lib "WSOCK32.DLL" (ByVal _
    hostname$) As Long
    Private Declare Sub RtlMoveMemory Lib "KERNEL32" (hpvDest As Any, _
    ByVal hpvSource&, ByVal cbCopy&)
    
    
    Private Type HOSTENT
    hName As Long
    hAliases As Long
    hAddrType As Integer
    hLength As Integer
    hAddrList As Long
    End Type
    Private iCount As Integer
    
    Private Function getip(name As String) As String
    Dim hostent_addr As Long
    Dim HOST As HOSTENT
    Dim hostip_addr As Long
    Dim temp_ip_address() As Byte
    Dim i As Integer
    Dim ip_address As String
    
    hostent_addr = gethostbyname(name)
    
    If hostent_addr = 0 Then
    getip = "" '主机名不能被解释
    Exit Function
    End If
    
    RtlMoveMemory HOST, hostent_addr, LenB(HOST)
    RtlMoveMemory hostip_addr, HOST.hAddrList, 4
    
    ReDim temp_ip_address(1 To HOST.hLength)
    RtlMoveMemory temp_ip_address(1), hostip_addr, HOST.hLength
    
    For i = 1 To HOST.hLength
    ip_address = ip_address & temp_ip_address(i) & "."
    Next
    ip_address = Mid$(ip_address, 1, Len(ip_address) - 1)
    
    getip = ip_address
    
    End Function
    
    
    
    
    
    Private Sub Command1_Click()
    
    wskServer.LocalPort = 8081
    wskServer.Listen
    Command1.Enabled = False
    
    End Sub
    
    
    
    
    
    
    Private Sub Winsock1_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)
        MsgBox Description, vbExclamation, "ERROR"
        
        Winsock.Close
    End Sub
    
    Private Sub wskClent_DataArrival(Index As Integer, ByVal bytesTotal As Long)
    Dim bty() As Byte
    ReDim bty(1 To bytesTotal) As Byte
    
            Dim strHost        As String
            Dim strPort As String
            Dim strdata       As String
            Dim strHeader       As String
            Dim pos As Integer
            Dim strDataSend As String
            Dim strPostData As String
            'wskClent(Index).GetData bty, vbByte
            
            
              '接收数据
              wskClent(Index).GetData strdata, vbString
            
            '这里把所有的内容都处理一次
            Dim headdata() As String
            'headdata = Split(Replace(Replace(strdata, vbCrLf, vbCr), vbCr & vbCr, vbCr), vbCr)
            headdata = Split(strdata, vbCrLf)
            
            For i = LBound(headdata) To UBound(headdata)
                Dim jj As Boolean
                jj = False
                '主机地址
                pos = InStr(1, UCase(headdata(i)), "HOST:")
                If pos > 0 Then
                    Dim strhosttemp As String
                    strhosttemp = Trim(Mid(headdata(i), 6))
                    
                    If InStr(1, strhosttemp, ":") Then
                        strPort = Right(strhosttemp, Len(strhosttemp) - InStr(1, strhosttemp, ":"))
                        strHost = Left(strhosttemp, InStr(1, strhosttemp, ":") - 1)
                              
                    Else
                        strHost = strhosttemp
                        strPort = 80
                    End If
                    
                End If
                
                '处理 请求地址
                Dim action As String
                pos = InStr(1, headdata(i), " ")
                If pos > 0 Then
                    action = Trim(UCase(Left(headdata(i), pos)))
                    If action = "GET" Or action = "POST" Then
    '                        If action = "POST" Then
    '                            strPostData = headdata(UBound(headdata))
    '                        End If
                        If InStr(4, UCase(headdata(i)), "HTTP") > 0 Then
                            pos = InStr(12, headdata(i), "/")
                            strDataSend = action & " " & Mid(headdata(i), pos)
                            Debug.Print action & " " & Mid(headdata(i), pos)
                            jj = True
                        End If
                    End If
                End If
                
                If UCase(Left(headdata(i), 6)) = "PROXY-" Then
                    jj = True
                    strDataSend = strDataSend & vbCrLf & "Connection: Keep-Alive"
                End If
                
                If (jj = False) Then
                    strDataSend = strDataSend & vbCrLf & headdata(i)
                End If
                
                
            Next
            'strDataSend = strDataSend + vbCrLf
            
    
            
    
    '          pos = InStr(1, UCase(strData), "HOST:") + 5
    '          strHost = getip(Trim(Mid(strData, pos, InStr(pos, strData, vbCrLf) - pos)))
    '    strHeader = Left(strData, InStr(1, strData, vbCrLf))
        'Debug.Print strDataSend
    '    Debug.Print "========================================"
    '    Debug.Print strdata
    '    Debug.Print "========================================"
        
        If strHost = "" Then
            wskClent(Index).SendData "HTTP/1.1 400 Bad Request\r\nConnection: close\r\nContent-Type: text/html\r\n\r\n<html><head><title>400 Bad Request</title></head><body><div align=""center""><table border=""0"" cellspacing=""3"" cellpadding=""3"" bgcolor=""#C0C0C0""><tr><td><table border=""0"" width=""500"" cellspacing=""3"" cellpadding=""3""><tr><td bgcolor=""#B2B2B2""><p align=""center""><strong><font size=""2"" face=""Verdana"">400 Bad Request</font></strong></p></td></tr><tr><td bgcolor=""#D1D1D1""><font size=""2"" face=""Verdana""> 主机错误  </font></td></tr></table></center></td></tr></table></div></body></html>"
            Exit Sub
        End If
        wskSend(Index).Close
        
        wskSend(Index).RemoteHost = strHost
        wskSend(Index).RemotePort = strPort
        
        'Debug.Print "host:" & strHost
    'If InStr(1, strHost, ":") Then
    '                          wskSend(Index).RemoteHost = Left(strHost, InStr(1, strHost, ":") - 1)
    '                          wskSend(Index).RemotePort = Right(strHost, Len(strHost) - InStr(1, strHost, ":"))
    '                  Else
    '                          wskSend(Index).RemoteHost = strHost
    '                          wskSend(Index).RemotePort = 80
    '                  End If
    wskSend(Index).Connect   '联接主机
    
    
    
    '是不是联接成功
              Do While wskSend(Index).State <> 7
                DoEvents
                'Debug.Print   Winsock3(Index).State
                If wskSend(Index).State = sckError Then
                      '如果联接错误
                      wskClent(Index).SendData "HTTP/1.1 400 Bad Request\r\nConnection: close\r\nContent-Type: text/html\r\n\r\n<html><head><title>400 Bad Request</title></head><body><div align=""center""><table border=""0"" cellspacing=""3"" cellpadding=""3"" bgcolor=""#C0C0C0""><tr><td><table border=""0"" width=""500"" cellspacing=""3"" cellpadding=""3""><tr><td bgcolor=""#B2B2B2""><p align=""center""><strong><font size=""2"" face=""Verdana"">400 Bad Request</font></strong></p></td></tr><tr><td bgcolor=""#D1D1D1""><font size=""2"" face=""Verdana""> 不能联接到指定主机  </font></td></tr></table></center></td></tr></table></div></body></html>"
                      DoEvents
                      wskClent(Index).Close
                      wskSend(Index).Close
                      If Index > 0 Then           '从内存中卸载无用的控件
                              Unload wskClent(Index)
                              Unload wskSend(Index)
                      End If
                      Exit Sub
                End If
                'Debug.Print "wkssend  state:" & wskSend(Index).State
              Loop
                
                
              wskSend(Index).SendData strDataSend
              '  Debug.Print "========================================"
              
    
    
    End Sub
    '
    'Private Sub wskSend_Close(Index As Integer)
    ' wskClent(Index).Close
    '          If Index > 0 Then
    '                  Unload wskClent(Index)
    '                  Unload wskSend(Index)
    '          End If
    '
    'End Sub
    '
    Private Sub wskClent_Close(Index As Integer)
     wskSend(Index).Close
              If Index > 0 Then
                      Unload wskClent(Index)
                      Unload wskSend(Index)
              End If
    End Sub
    
     'sckClosed 0 关闭状态
    'sckOpen 1 打开状态
    'sckListening 2 侦听状态
    'sckConnectionPending 3 连接挂起
    'sckResolvingHost 4 解析域名
    'sckHostResolved 5 已识别主机
    'sckConnecting 6 正在连接
    'sckConnected 7 已连接
    'sckClosing 8 同级人员正在关闭连接
    'sckError 9 错误
    
    Private Sub wskSend_DataArrival(Index As Integer, ByVal bytesTotal As Long)
        Dim strdata As String
    'If bytesTotal = 0 Then
    '    Exit Sub
    'Else
        'wskSend(Index).GetData strdata, vbString
    '    Debug.Print "长度:" & bytesTotal
    'End If
    
    
    'Debug.Print strdata
     
    Dim bty() As Byte
    'ReDim bty(1 To bytesTotal) As Byte
    
    If wskSend(Index).State = 7 Then
            wskSend(Index).GetData bty, vbByte + vbArray, bytesTotal
    End If
    
    'Debug.Print "状态:" & wskClent(Index).State
    
    If wskClent(Index).State = 7 Then
    wskClent(Index).SendData bty
    'Debug.Print "发回..."
    End If
    
    End Sub
    
     
    
    Private Sub wskServer_ConnectionRequest(ByVal requestID As Long)
    iCount = iCount + 1
     
    Load wskClent(iCount)
    Load wskSend(iCount)
    wskClent(iCount).Accept requestID
    End Sub
    
     

    网上的代码没一个能正常运行的,根据一些代码,改了一下,基本可以用了!不过,在动态加载winsock的时候,用的一个变量,因为这个变量 一直在增加,所以这里需要改进,靠大家的智慧了!

  • 相关阅读:
    你真的会玩SQL吗?让人晕头转向的三值逻辑
    SQL Server 索引维护:系统常见的索引问题
    MySQL Proxy 实现 MySQL 读写分离提高并发负载
    php 处理上百万条的数据库如何提高处理查询速度
    sql事务(Transaction)用法介绍及回滚实例
    数据库update的异常一例
    使用Java正则表达式提取字符串中的数字一例
    JodaTime library not available
    java web中日期Date类型在页面中格式化显示的三种方式
    深入剖析js命名空间函数namespace
  • 原文地址:https://www.cnblogs.com/szyicol/p/2503591.html
Copyright © 2020-2023  润新知