Прокся на С#

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by ascas, 21 Feb 2006.

  1. ascas

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

    Joined:
    19 Jan 2006
    Messages:
    56
    Likes Received:
    4
    Reputations:
    2
    Здарова, мне нужно написать http прокси сервер на С# (под NET платформу), но я практически ничего не знаю про структуру серверов. Есть какие нибуть мысли с чего мне начинать, может у кого есть какой нибуть исходник на эту тему?
     
  2. KEZ

    KEZ Ненасытный школьник

    Joined:
    18 May 2005
    Messages:
    1,604
    Likes Received:
    754
    Reputations:
    397
    Есть. Незнаю как на C#, но я делал так.
    Создавай сокет, ставь его на прослушку на порту например 3128, при подключении создай поток (параметр которого - новый сокет клиента подключившегося). И считывай запрос. Далее бери оттуда строку "Host: <хост>" и подключайся к этому <хост>.
    И весь запрос шли ему. Читай оттуда ответ и шли обратно клиенту. Закрывай сокет.
    А ещё можно использовать WinInet.
    А ещё предлагаю написать сокс4,5
     
  3. ascas

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

    Joined:
    19 Jan 2006
    Messages:
    56
    Likes Received:
    4
    Reputations:
    2
    Как я понял чтобы получить ответ от хоста которому будет послана команда от прокси сервера, надо ему послать http команду, но в http я полный нуль, может есть какие нибуть примеры.

    Ламерский вопрос, но в чем разница между сокс и http? :)
     
  4. KEZ

    KEZ Ненасытный школьник

    Joined:
    18 May 2005
    Messages:
    1,604
    Likes Received:
    754
    Reputations:
    397
    Пошли ему тоже самое что тебе послал клиент.
    Тебе не надо разбираться в этом. Скажу только что ХТТП запрос имеет такую структуру (пример)

    МЕТОД /путь/ HTTP/1.1\r\n
    Host: хост\r\n
    Connection: Close или Keep-Alive\r\n
    User-Agent: строка, идентиф. браузер\r\n
    другие опции
    \r\n

    например
    GET /index.php HTTP/1.1\r\n
    Host: antichat.ru\r\n
    Connection: Close\r\n
    \r\n

    попробуй приконектись к antichat.ru:80 телнетом и пошли ему это. (разумеется, \r\n - замени на перенос на новую строчку)
    он тебе вернет ответ

    HTTP/1.1 200 OK
    ещё много всего....\r\n
    ...\r\n
    \r\n
    данные, например главная страничка (хтмл код)
     
    #4 KEZ, 21 Feb 2006
    Last edited: 21 Feb 2006
  5. KEZ

    KEZ Ненасытный школьник

    Joined:
    18 May 2005
    Messages:
    1,604
    Likes Received:
    754
    Reputations:
    397
    HTTP - протокол передачи веб страничек
    SOCKS - механизм туннелирования. можно так сказать моими словами.
     
  6. ascas

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

    Joined:
    19 Jan 2006
    Messages:
    56
    Likes Received:
    4
    Reputations:
    2
    спасибо за инфу, сегодня вечером попробую составить прогу и если повезет получить ответ от сайта :rolleyes:
     
  7. ascas

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

    Joined:
    19 Jan 2006
    Messages:
    56
    Likes Received:
    4
    Reputations:
    2
    Ну вот что у меня вышло (код на vb но большой разницы нету, и так все понятно ;) ):
    Code:
    Public Client As Sockets.TcpClient
        Public Server As Sockets.TcpListener
    
        Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
            If Server.Pending Then
                Dim socket As Socket = New Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Tcp)
                socket = Server.AcceptSocket()
                Dim buf() As Byte
                socket.Receive(buf, SocketFlags.None)
                If buf.Length <> 0 Then
                    MsgBox("buf priniat")
                End If
            End If
        End Sub
    
        'Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        '    Dim buf() As Byte
        '    Dim message As String = TextBox1.Text
        '    buf = System.Text.Encoding.Default.GetBytes(message)
        '    Client = New TcpClient("www.google.com", 80)
        '    Client.GetStream.Write(buf, 0, buf.Length)
        '    Client.Close()
        'End Sub
    
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Server = New TcpListener(IPAddress.Parse("IP"), 180)
            Server.Start()
        End Sub
    вот собрал за пару минут для того чтобы проверить соеденится ли с ним A4Proxy при проверке прокси. Все вроде соеденяет, но в строке socket.Receive(buf, SocketFlags.None)
    выдает ошибку что буффер пустой и ничего не приняло
    "Parameter value cannot be null"
    Наверно я неправильно настроил socket, но соеденение он принимает, так что не могу понять в чем сдесь проблема :confused:
     
  8. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    729
    Reputations:
    266
    а где класс проксисервера в этом коде? ) забыл написать, да? =)
     
  9. KEZ

    KEZ Ненасытный школьник

    Joined:
    18 May 2005
    Messages:
    1,604
    Likes Received:
    754
    Reputations:
    397
    Ой незнаю, используйте С-средства разработки вашего прокси, тогда я скажу сразу почему буфер пустой... На бейсике это извращение
     
  10. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    729
    Reputations:
    266
    назови хотя бы одно функциональное отличие Vb.net от C#!
     
  11. KEZ

    KEZ Ненасытный школьник

    Joined:
    18 May 2005
    Messages:
    1,604
    Likes Received:
    754
    Reputations:
    397
    nerezus, ты мне скажи что такое С# - и я тебе назову.
    Я предложил все сделать по нормальному, взять Visual Studio, Borland C, и тп, и накатать прокси. А всякие ваши vb.net, C#, и т д для меня как "линукс для секретарши"
     
  12. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    729
    Reputations:
    266
    C# - попытка Некрософта отнять часть лавров у Джавы. Можно сказать, что это пока еще у них не получилось. Это идеальная задумка, но немного нехорошо реализованная. отлично подходит для написания прикладного софта/серверов/корпоративных приложений/работы с базами данных.

    А для программистов? Тебе не нравится - и не юзай. Не надо считать, что все делается для тебя. Не считай себя пупом земли. Не надо всех обсирать, если их мнение(причем зачастую правильное) не совпадает с твоим.

    P.S. Я не копрофил, чтобы пользоваться такими технололгиями, как Borland C/C++ или MFC. Смею заметить, что прогресс не стоит на месте. И задуматься, почему же авторы этих технологий отказались от них ;)
    P.P.S. И еще больше я ненавижу завязку логики программы на интерфейсе(правда грешат этим только борладновские продукты и VB до версии 6 включительно.)
     
  13. KEZ

    KEZ Ненасытный школьник

    Joined:
    18 May 2005
    Messages:
    1,604
    Likes Received:
    754
    Reputations:
    397
    Я не юзаю. И я ненавижу все виды бейсика. И мне не нравится программирование на джаве. И никого я не "обсирал" я только сказал что мне это все неинтересно и чтобы написать проксю ненадо в это вникать

    А ещё мне абсолютно похрену на прогресс, куда он там идет... Lolevel форева)
     
  14. ascas

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

    Joined:
    19 Jan 2006
    Messages:
    56
    Likes Received:
    4
    Reputations:
    2
    Короче вернемся к теме, ненравиться вб держи на С#:
    Code:
    [STAThread]
    		static void Main() 
    		{
    			Application.Run(new Form1());
    		}
    
    		private void Form1_Load(object sender, System.EventArgs e)
    		{
    		 Server = new System.Net.Sockets.TcpListener(IPAddress.Parse("IP"), 180);
    			Server.Start();
    
    		}
    
    		private void timer1_Tick(object sender, System.EventArgs e)
    		{ 
    			if (Server.Pending()) 
    			{ 
    				System.Net.Sockets.Socket socket = new System.Net.Sockets.Socket(System.Net.Sockets.AddressFamily.InterNetwork, System.Net.Sockets.SocketType.Raw, System.Net.Sockets.ProtocolType.Tcp); 
    				socket = Server.AcceptSocket(); 
    				byte[] buf;
    				buf = System.Text.Encoding.Default.GetBytes(""); 
    				socket.Receive(buf, System.Net.Sockets.SocketFlags.None); 
    				//MessageBox.Show(this, s);
    				if (buf.Length != 0) 
    				{ 
    					MessageBox.Show(this, "buf priniat"); 
    				} 
    			} 
    		}
    проблема та же самая, после приема буффер пустой
     
    #14 ascas, 23 Feb 2006
    Last edited: 23 Feb 2006
  15. ascas

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

    Joined:
    19 Jan 2006
    Messages:
    56
    Likes Received:
    4
    Reputations:
    2
    ну так ктонибуть знает что тут нитак? я никак неиогу понять :confused:
     
  16. ascas

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

    Joined:
    19 Jan 2006
    Messages:
    56
    Likes Received:
    4
    Reputations:
    2
    ну вот, следуя совету кеz'a я написал прогу которая читывает все что ей посылает A4proxy. Следующее как я понял надо все это передать тому, кому это направлено (сейчас я пробую только с гугл). Ну так вот я открываю новый сокет и соеденяюсь с гуглом на 80 порт, после чего посылаю сообщение принятое A4proxy. Дальше по идее, по этому же сокету мне должен прийти ответ, но он не приходит, что я теперь делаю нитак
    З.Ы если надо будет то выложу и исходник, но скорее всего тут какая то совсем явная ошибка а я ее как обычно не замечаю :)