Создание прокси сервера на VB.NET?

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by z0mbyak, 1 Feb 2011.

  1. z0mbyak

    z0mbyak Active Member

    Joined:
    10 Apr 2010
    Messages:
    536
    Likes Received:
    200
    Reputations:
    293
    Доброго времени суток, уважаемые форумчане.

    Нарисовалась задача написать прокси сервер для сети (машин 20), обычный Http прокси сервер, только вот не могу даже понять откуда начать:-(

    Заранее благодарю за помощь,

    C уважением, z0mbyak.

    P.S. Пишу на VB.NET из VS 2010
     
  2. noxjoker

    noxjoker Member

    Joined:
    7 Aug 2009
    Messages:
    189
    Likes Received:
    24
    Reputations:
    0
    Если посмотреть немного ниже
    http://forum.antichat.net/thread256549.html


    Я почти все сделал только ответ от сервера криво приходит :mad:

    Правд на C# но там недалеко;)
     
    #2 noxjoker, 1 Feb 2011
    Last edited: 1 Feb 2011
    1 person likes this.
  3. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    VB для таких целей - это самое ][еровое
    Лучше уже на сишке или на другом любом нормальном языке.
    Даже от C# больше толку тут чем от VB.
    Вообще всё очень просто.

    Если абсолютно ноль, то лучше в делфи компонентик на форму кинь и будет готово.
    На си обычный HTTP прокси выходит гдето в 2-3 килобайт исполняемый файл. И примерно строк в 400 кода отслилы, если делать все проверки

    Идея всё проста (главное выбрать модель работы с сокетами), но основа такова:
    - подрубился чел
    - ты считываешь данные пока не встретишь \r\n
    - как встретил \r\n так значит первая строка считалась
    - из первой строки выбираешь IP и порт куда коннектится.
    - делаешь коннект куда надо.
    - если не сконнектился то говоришь типа bad gateway и закрываешь коннект
    - если сконнектился, то правишь первую строку (удаляешь адерс и порт запроса)
    - затем начинаешь передаешь её серваку
    - далее начинаешь обмен данными между серваком и клиентов.
    - как тока дисконнект у когото, так рви все коннекты.

    Главное не забыть про Connection: Keep-Alive или ставить на Close на лету. или же придется фиксировать факт второго запроса и там уже парсить занового HTTP заголовок
     
    1 person likes this.
  4. z0mbyak

    z0mbyak Active Member

    Joined:
    10 Apr 2010
    Messages:
    536
    Likes Received:
    200
    Reputations:
    293
    2 noxjoker:

    Спасибо, почитаю, может даже разберусь:)

    2 slesh:

    Да я в курсе, что VB для этих целей не очень, но я ток на нем и умею кодить:) на VB 6.0 и VB.NET (переучиваюсь с VB 6), как бы не хотелось изучать тот же C# только для написания диплома...
    Нашел сорс, только он работает очень медленно и криво, подскажите что не так (пока про keep-Alive речи даже не идет)

    Code:
    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;
                    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)
                    End While
                    IPsocket.Shutdown(SocketShutdown.Both)
                    IPsocket.Close()
                    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
            'Public Overloads Shared 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 
     
    #4 z0mbyak, 1 Feb 2011
    Last edited: 1 Feb 2011