Не работает прокси сервер.

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Dakovalev1
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 154
Зарегистрирован: 23.02.2010 (Вт) 14:16

Не работает прокси сервер.

Сообщение Dakovalev1 » 06.02.2011 (Вс) 14:30

Делал прокси сервер.
Создал Tcplistener на порт 8888(в браузере в настройках прокси-сервера указал тоже самое).
Дальше делал цикл, получал от Tcplstener`a socket и создавал поток для обработки.

Обрабатывал так: получал массив байтов от сокета, создавал tcpclient(порт 80) и в его поток записывал массив байтов, затем читал этот поток, получал новый массив байтов и отправлял его обратно в сокет.
Вот код. Он на managed c++, потому, что visual basic у меня сломался после апргрейда системы с висты на 7.

вот цикл.
Код: Выделить всё
TcpListener^ proxy = gcnew TcpListener(8888);
   proxy->Start();
   while(true)
   {
   Socket^s = proxy->AcceptSocket();
   proc^ prc = gcnew proc;
   prc->s = s;
   Threading::ThreadStart^start = gcnew Threading::ThreadStart(prc,&proc::process);
   Threading::Thread^ thrd = gcnew Threading::Thread(start);
    thrd->Start ();
   }

вот обработка
Код: Выделить всё
ref class proc
{
public:
   Socket^s;
void process()
{
   
   
   array<Byte>^ buf = gcnew array<Byte>(8192);
   int bytes = s->Receive(buf,buf->Length,(SocketFlags)0);
   String^ str= Encoding::ASCII->GetString(buf); //весь запрос от браузера
   
   

   String^ url = "";
   int n1 = str->IndexOf(L" "),n2 = str->IndexOf(L" ",n1+1);
   url = str->Substring(n1+1,n2-n1-1);
   url = url->Substring(7,url->IndexOf("/",8)-7);//вырезаем из него адрес узла (было http://www.google.ru/ стало www.google.ru)

   TcpClient^cli = gcnew TcpClient(url,80);//клиент
   cli->GetStream()->Write(buf,0,buf->Length);//отправка
   
   cli->GetStream()->Read(buf,0,buf->Length);//получение ответа

   s->Send(buf,buf->Length,(SocketFlags)0);//перенаправка к браузеру
   str= Encoding::ASCII->GetString(buf);//это просто так
   
      
   
   Console::WriteLine("Complete!");
   s->Close();
}
};

Подскажите, в чём ошибка.(с горем пополам грузит google и на этом всё).

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Не работает прокси сервер.

Сообщение FireFenix » 06.02.2011 (Вс) 20:43

Очередной глупый вопрос?
Ты знаешь что такое отладка и брейкпоинты? Нет - качай скил и тогда потом приступай к программированию.
И вообще, следовало бы почитать про механизмы получения и отправки сообщений, прежде чем лезть в это

Dakovalev1 писал(а):Подскажите, в чём ошибка.(с горем пополам грузит google и на этом всё).

В коде

надоел уже, последний раз помогаю
Код: Выделить всё
Imports System.Net
Imports System.Net.Sockets
Imports System.Threading
Imports System.Collections
Imports System.Collections.Generic

Public Class Form1
    Private Socket As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
    Private Thread As New Thread(AddressOf Me.Listen) With {.IsBackground = True}

    Public Sub New()
        InitializeComponent()

        Me.Init()
    End Sub

    Public Sub Init()
        Dim Host As IPEndPoint = New IPEndPoint(IPAddress.Any, 8080)

        Try
            Socket.Bind(Host)
        Catch ex As Exception
            MsgBox("Error Socket.Bind: " & ex.ToString)
        End Try

        Socket.Listen(10)
        Socket.Blocking = False

        Thread.Start()
    End Sub

    Public Sub Listen()
        While True
            If Me.Socket.Poll(0, SelectMode.SelectRead) Then
                Dim Socket As Socket = Me.Socket.Accept

                Dim Proxy as New Proxy(Socket, 500)
            End If

            System.Threading.Thread.Sleep(1)
        End While
    End Sub

    Private Sub Stop_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Me.Thread.Abort()

        If Me.Socket.Connected Then
            Me.Socket.Disconnect(False)
        End If

        Me.Socket.Dispose()

        End
    End Sub
End Class

Public Class Proxy
    Private Socket As Socket
    Private KeepAlive As Integer

    Private Site As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp) With {.ReceiveBufferSize = .ReceiveBufferSize * 4}
    Private Thread As New Thread(AddressOf Start) With {.IsBackground = True}

    Public Sub New(ByRef Socket As Socket, ByVal KeepAlive As Integer)
        Me.Socket = Socket
        Me.KeepAlive = KeepAlive

        Me.Thread.Name = Socket.LocalEndPoint.ToString
        Me.Thread.Start()
    End Sub

    Public Sub Start()
        Dim i As Integer

        Dim Timer As New System.Diagnostics.Stopwatch

        Dim Send_Client As Integer = 0
        Dim Send_Site As Integer = 0
        Dim Receive_Client As Integer = 0
        Dim Receive_Site As Integer = 0

        Dim [Error] As String = Nothing

        Dim Buffer(Socket.ReceiveBufferSize) As Byte

        Dim StartString As String = Nothing
        Dim SplitedStart() As String = Nothing

        Dim Uri As Uri = Nothing

        Dim IP As IPAddress = Nothing
        Dim Host As IPHostEntry = Nothing

        If Socket.Available > 0 Then
            Receive_Client = Socket.Receive(Buffer)

            If Receive_Client > 5 Then
                For i = 0 To Receive_Client - 2
                    If Buffer(i) = 13 AndAlso Buffer(i + 1) = 10 Then
                        StartString = System.Text.Encoding.ASCII.GetString(Buffer, 0, i)

                        If StartString.Length > 0 Then
                            SplitedStart = StartString.Split(" "c)

                            If SplitedStart.Length > 2 Then
                                Uri = New Uri(SplitedStart(1))
                            End If
                        End If

                        Exit For
                    End If
                Next
            End If
        End If

        If Not Uri Is Nothing AndAlso Uri.Host.Length > 0 Then
            Try
                Host = Dns.GetHostEntry(Uri.Host)
            Catch ex As Exception
                [Error] = SplitedStart(2) & " 404 Not Found"

                System.Text.Encoding.ASCII.GetBytes([Error], 0, [Error].Length, Buffer, 0)

                While True
                    If Socket.Poll(0, SelectMode.SelectWrite) = True Then
                        Socket.Send(Buffer, 0, [Error].Length, SocketFlags.None)

                        Exit While
                    End If

                    System.Threading.Thread.Sleep(1)
                End While
            End Try

            If [Error] Is Nothing Then
                For Each IP In Host.AddressList
                    If IP.AddressFamily = System.Net.Sockets.AddressFamily.InterNetwork Then
                        Site.Connect(IP, Uri.Port)

                        While True
                            If Site.Poll(Me.KeepAlive * 100, SelectMode.SelectWrite) = True Then
                                Send_Site = Site.Send(Buffer, 0, Receive_Client, SocketFlags.None)

                                Exit While
                            End If

                            System.Threading.Thread.Sleep(1)
                        End While

                        Timer.Restart()

                        While (Timer.ElapsedMilliseconds) <= Me.KeepAlive
                            If Site.Poll(Me.KeepAlive * 100, SelectMode.SelectRead) = True AndAlso Site.Available > 0 Then
                                Receive_Site = Site.Receive(Buffer)

                                If Receive_Site > 0 Then
                                    Timer.Restart()

                                    Try
                                        Socket.Send(Buffer, 0, Receive_Site, SocketFlags.None)
                                    Catch ex As Exception

                                    End Try
                                End If
                            End If

                            System.Threading.Thread.Sleep(100)
                        End While

                        Timer.Stop()

                        Exit For
                    End If
                Next
            End If
        End If

        If Site.Connected Then
            Try
                Site.Disconnect(False)
            Catch ex As Exception

            End Try
        End If

        If Socket.Connected Then
            Try
                Socket.Disconnect(False)
            Catch ex As Exception

            End Try
        End If

        Site.Dispose()
        Socket.Dispose()
    End Sub
End Class
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

Dakovalev1
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 154
Зарегистрирован: 23.02.2010 (Вт) 14:16

Re: Не работает прокси сервер.

Сообщение Dakovalev1 » 06.02.2011 (Вс) 23:53

Спасибо. Буду читать.

Dakovalev1
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 154
Зарегистрирован: 23.02.2010 (Вт) 14:16

Re: Не работает прокси сервер.

Сообщение Dakovalev1 » 07.02.2011 (Пн) 0:52

А вообще чего ругаться?
Не слишком ли много требуется от восьмикласника? :?: :)

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Не работает прокси сервер.

Сообщение FireFenix » 07.02.2011 (Пн) 1:06

Dakovalev1 писал(а):А вообще чего ругаться?
Не слишком ли много требуется от восьмикласника? :?: :)

Это интернет, тут все равны в правах как люди.

Не слишком ли много требуется :?:

Ничего не требуется.

Предполагается, что человек должен изучать отдельно все компоненты по частям, а уже потом реализует комплексную систему.
А ты сразу лезешь писать, то что слабо представляешь, так ничего не изучив.
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

Dakovalev1
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 154
Зарегистрирован: 23.02.2010 (Вт) 14:16

Re: Не работает прокси сервер.

Сообщение Dakovalev1 » 07.02.2011 (Пн) 14:22

FireFenix писал(а):
Dakovalev1 писал(а):Предполагается, что человек должен изучать отдельно все компоненты по частям, а уже потом реализует комплексную систему.
А ты сразу лезешь писать, то что слабо представляешь, так ничего не изучив.


Было бы где изучать.

Dakovalev1
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 154
Зарегистрирован: 23.02.2010 (Вт) 14:16

Re: Не работает прокси сервер.

Сообщение Dakovalev1 » 07.02.2011 (Пн) 14:49

Вот например вот.
Кроме этого про сокеты я мало нашёл.
В википедии вообще мало про них написано.
зато естьhttp.

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Не работает прокси сервер.

Сообщение FireFenix » 07.02.2011 (Пн) 19:45

Кровчик Э., Кумар В., Лагари Н., Мунгале А., Нагел К., Паркер Т., Шивакумар Ш. - Сетевое программирование для профессионалов
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

Dakovalev1
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 154
Зарегистрирован: 23.02.2010 (Вт) 14:16

Re: Не работает прокси сервер.

Сообщение Dakovalev1 » 07.02.2011 (Пн) 23:01

Это всё одна книга?
Спасибо большое.


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 37

    TopList