vb.net中的代理服务器应用程序 [英] proxy server application in vb.net

查看:89
本文介绍了vb.net中的代理服务器应用程序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

Imports System '
Imports System.Net
Imports System.Net.Sockets
Imports System.Text
Imports System.IO
Imports System.Threading
Namespace WebProxy2
    Class WebProxy2
        Private clientSocket As Socket
        Private read() As [Byte] = New Byte(1024) {}
        Private Buffer As [Byte]() = Nothing
        Private ASCII As Encoding = Encoding.ASCII
        Private HTTP_VERSION As String = "HTTP/1.0"
        Private CRLF As String = ControlChars.Cr + ControlChars.Lf
        Private RecvBytes(4096) As [Byte]
        Public Sub New(ByVal socket As Socket)
            Me.clientSocket = socket
        End Sub 'New
        Public Sub run()
            Dim clientmessage As [String] = " "
            Dim sURL As [String] = " "
            Dim bytes As Integer = readmessage(read, clientSocket, clientmessage)
            If bytes = 0 Then
                Return
            End If
            Dim index1 As Integer = clientmessage.IndexOf(" "c)
            Dim index2 As Integer = clientmessage.IndexOf(" "c, index1 + 1)
            If index1 = -1 Or index2 = -1 Then
                Throw New IOException
            End If
            Console.WriteLine("Connecting to Site: {0}", clientmessage.Substring(index1 + 1, index2 - index1))
            Console.WriteLine("Connection from {0}", clientSocket.RemoteEndPoint)
            Dim part1 As String = clientmessage.Substring(index1 + 1, index2 - index1)
            Dim index3 As Integer = part1.IndexOf("/"c, index1 + 8)
            Dim index4 As Integer = part1.IndexOf(" "c, index1 + 8)
            Dim index5 As Integer = index4 - index3
            sURL = part1.Substring(index1 + 4, part1.Length - index5 - 8)

            Try
                Dim IPHost As IPHostEntry = Dns.Resolve(sURL)
                Console.WriteLine("Request resolved: ", IPHost.HostName)
                Dim aliases As String() = IPHost.Aliases
                Dim address As IPAddress() = IPHost.AddressList
                Console.WriteLine(address(0))
                Dim sEndpoint As New IPEndPoint(address(0), 80)
                Dim IPsocket As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
                IPsocket.Connect(sEndpoint)
                If IPsocket.Connected Then
                    Console.WriteLine("Socket connect OK")
                End If
                Dim [GET] As String = clientmessage
                Dim ByteGet As [Byte]() = ASCII.GetBytes([GET])
                IPsocket.Send(ByteGet, ByteGet.Length, 0)
                Dim rBytes As Int32 = IPsocket.Receive(RecvBytes, RecvBytes.Length, 0)
                Console.WriteLine("Recieved {0}", +rBytes)
                'Buffer = RecvBytes;
                ByteGet = RecvBytes
                Dim strRetPage As [String] = Nothing
                'strRetPage = strRetPage + ASCII.GetString(RecvBytes, 0, rBytes)
                While rBytes > 0
                    rBytes = IPsocket.Receive(RecvBytes, RecvBytes.Length, 0)
                    ' strRetPage = strRetPage + ASCII.GetString(RecvBytes, 0, rBytes)
                    Dim i As Int32 = UBound(ByteGet)
                    ReDim Preserve ByteGet(UBound(ByteGet) + rBytes + 1)
                    For x As Long = 1 To rBytes
                        ByteGet(i + x) = RecvBytes(x - 1)
                    Next
                End While
                IPsocket.Shutdown(SocketShutdown.Both)
                IPsocket.Close()
                strRetPage = strRetPage + ASCII.GetString(ByteGet, 0, ByteGet.Length)
                clientSocket.Send(ByteGet, ByteGet.Length, 0)
                ' sendmessage(clientSocket, strRetPage)

            Catch exc2 As Exception
                Console.WriteLine(exc2.ToString())
            End Try
        End Sub 'run
        Private Function readmessage(ByVal ByteArray() As Byte, ByRef s As Socket, ByRef clientmessage As String) As Integer
            Dim bytes As Integer = s.Receive(ByteArray, 1024, 0)
            Dim messagefromclient As String = Encoding.ASCII.GetString(ByteArray)
            clientmessage = CType(messagefromclient, [String])
            Return bytes
        End Function 'readmessage
        Private Sub sendmessage(ByVal s As Socket, ByVal message As String)
            Buffer = New [Byte](message.Length - 1) {}
            Dim length As Integer = ASCII.GetBytes(message, 0, message.Length, Buffer, 0)
            s.Send(Buffer, length, 0)
        End Sub 'sendmessage
        'Entry point which delegates to C-style main Private Function
        Overloads Sub Main()
            Main(System.Environment.GetCommandLineArgs())
        End Sub
        Overloads Shared Sub Main(ByVal args() As String)
            Const port As Integer = 8889
            Dim tcplistener As New TcpListener(port)
            Console.WriteLine("Listening on port {0}", +port)
            tcplistener.Start()
            While True
                Dim socket As Socket = tcplistener.AcceptSocket()
                Dim webproxy As New WebProxy2(socket)
                Dim thread As New Thread(New ThreadStart(AddressOf webproxy.run))
                thread.Start()
            End While
        End Sub 'Main
    End Class 'WebProxy2
End Namespace 'WebProxy2



如果我将firefox或IE配置为代理服务器我收到标题没问题。

示例标题


If i configure firefox or IE to the proxy server I do receive the header no problem.
Sample Header

www.google.com
GET http://google.ca/ HTTP/1.1 Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/x-gsarcade-launch, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/xaml+xml, application/vnd.ms-xpsdocument, application/x-ms-xbap, application/x-ms-application, application/x-silverlight, */* Accept-Language: en-us User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; InfoPath.2; .NET CLR 3.5.30729) Accept-Encoding: gzip, deflate Proxy-Connection: Keep-Alive Host: google.ca Cookie: PREF=ID=2cc48986d0a30551:U=4583f9a4276fb2df:FF=0:TM=1297940975:LM=1297941095:S=k0i-eurczYyMJF2q; NID=44=t7EdDRwCJHYI-iYWLo4NeRJ3DtFmv7wZ4yeUmEdemRP7X83I-kRJd6Ah3uf2rw-et_c_H5zYDd7vJuApaX0vs2K_jz30l7uQZPfmTdOeTvKpi67lXrbkiTP2DIOKeYew





我的问题是我怎么发这回浏览器并显示页面?



My question is how do I send this back to the browser and display the page?

推荐答案

好吧,当你连接它时,你正在创建一个新套接字,并在这里将新套接字传递给Webproxy2:



Well, you''re creating a new socket when you connect to it, and passing that new socket to Webproxy2 here:

Dim socket As Socket = tcplistener.AcceptSocket()
Dim webproxy As New WebProxy2(socket)





然后,在webProxy2中它被传递给私有对象clientSocket ... 对?因此,要将其发送回浏览器,您只需将其转换为字节数组并执行clientSocket.send(yourByteArray)。



...我看到了你已经这样做了(clientSocket.Send(ByteGet,ByteGet.Length,0))。如果你在浏览器中什么都没有,那么我想我会创建一个Web客户端并连接到谷歌,这样我就可以看到响应的差异。也许那时你就能看出为什么它没有在你的浏览器中显示。



希望这会有所帮助...



- Pete



Then, in webProxy2 it''s passed to the private object clientSocket... Right? So to send that back to the browser, you would just convert it to a byte array and do a clientSocket.send(yourByteArray).

...and I see you''re already doing that ( clientSocket.Send(ByteGet, ByteGet.Length, 0) ). If you''re getting nothing in the browser, then I guess I would create a web client and connect to google so I could see the difference in the response. Maybe then you''ll be able to see why it''s not displaying in your browser.

Hope this helps...

- Pete


这篇关于vb.net中的代理服务器应用程序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆