Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как подключаться через прокси? 
:(
    Опции темы
enginer
Дата 16.1.2007, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 16.1.2007

Репутация: нет
Всего: 1



Господа, может я не совсем по адресу, но в проге, которую пишу, очень нужно добавить возможность подключения через прокси (http(s), socks...), а вот как это реализовать, понятия не имеюМожет существуют для этого уже готовые классы? Или хоть в какую сторону копать подскажите, пожалуйста.
PM MAIL   Вверх
Gelis
Дата 16.1.2007, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 26.10.2006
Где: Брест

Репутация: нет
Всего: 4



Цитата

Может существуют для этого уже готовые классы?

Существуют
1. WebProxy
2. GlobalProxySelection

Код

            WebProxy myProxy = new WebProxy("192.168.1.200", 8080);
            myProxy.BypassProxyOnLocal = false;
            myProxy.Credentials = new NetworkCredential("user", "password");
            GlobalProxySelection.Select = myProxy;

PM MAIL   Вверх
enginer
Дата 17.1.2007, 09:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 16.1.2007

Репутация: нет
Всего: 1



Как я понял, WebProxy предназначен для работы с ХТТП прокси, а как быть с СОКС?
PM MAIL   Вверх
enginer
Дата 18.1.2007, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 16.1.2007

Репутация: нет
Всего: 1



неужели никто не знает?  smile 
PM MAIL   Вверх
mr.DUDA
Дата 18.1.2007, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 2
Всего: 232



Может тут что-то найдётся.


--------------------
user posted image
PM MAIL WWW   Вверх
enginer
Дата 19.1.2007, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 16.1.2007

Репутация: нет
Всего: 1



можно сказать не нашлось  smile 
PM MAIL   Вверх
mr.DUDA
Дата 19.1.2007, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 2
Всего: 232



Код
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

/*
* zahmed
* Date 23 Jan 2004
* Socks 5 RFC is available at http://www.faqs.org/rfcs/rfc1928.html.
*/
namespace LMKR
{
    public class ConnectionException : ApplicationException
    {
        public ConnectionException(string message)
            : base(message)
        {
        }
    }

    /// <summary>
    /// Provides sock5 functionality to clients (Connect only).
    /// </summary>
    public class SocksProxy
    {

        private SocksProxy()
        {
        }

        #region ErrorMessages
        private static string[] errorMsgs =    {
                                        "Operation completed successfully.",
                                        "General SOCKS server failure.",
                                        "Connection not allowed by ruleset.",
                                        "Network unreachable.",
                                        "Host unreachable.",
                                        "Connection refused.",
                                        "TTL expired.",
                                        "Command not supported.",
                                        "Address type not supported.",
                                        "Unknown error."
                                    };
        #endregion


        public static Socket ConnectToSocks5Proxy(string proxyAdress, ushort proxyPort, string destAddress, ushort destPort,
            string userName, string password)
        {
            IPAddress destIP = null;
            IPAddress proxyIP = null;
            byte[] request = new byte[257];
            byte[] response = new byte[257];
            ushort nIndex;

            try
            {
                proxyIP = IPAddress.Parse(proxyAdress);
            }
            catch (FormatException)
            {    // get the IP address
                proxyIP = Dns.GetHostByAddress(proxyAdress).AddressList[0];
            }

            // Parse destAddress (assume it in string dotted format "212.116.65.112" )
            try
            {
                destIP = IPAddress.Parse(destAddress);
            }
            catch (FormatException)
            {
                // wrong assumption its in domain name format "www.microsoft.com"
            }

            IPEndPoint proxyEndPoint = new IPEndPoint(proxyIP, proxyPort);

            // open a TCP connection to SOCKS server...
            Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            s.Connect(proxyEndPoint);

            nIndex = 0;
            request[nIndex++] = 0x05; // Version 5.
            request[nIndex++] = 0x02; // 2 Authentication methods are in packet...
            request[nIndex++] = 0x00; // NO AUTHENTICATION REQUIRED
            request[nIndex++] = 0x02; // USERNAME/PASSWORD
            // Send the authentication negotiation request...
            s.Send(request, nIndex, SocketFlags.None);

            // Receive 2 byte response...
            int nGot = s.Receive(response, 2, SocketFlags.None);
            if (nGot != 2)
                throw new ConnectionException("Bad response received from proxy server.");

            if (response[1] == 0xFF)
            {    // No authentication method was accepted close the socket.
                s.Close();
                throw new ConnectionException("None of the authentication method was accepted by proxy server.");
            }

            byte[] rawBytes;

            if (/*response[1]==0x02*/true)
            {//Username/Password Authentication protocol
                nIndex = 0;
                request[nIndex++] = 0x05; // Version 5.

                // add user name
                request[nIndex++] = (byte)userName.Length;
                rawBytes = Encoding.Default.GetBytes(userName);
                rawBytes.CopyTo(request, nIndex);
                nIndex += (ushort)rawBytes.Length;

                // add password
                request[nIndex++] = (byte)password.Length;
                rawBytes = Encoding.Default.GetBytes(password);
                rawBytes.CopyTo(request, nIndex);
                nIndex += (ushort)rawBytes.Length;

                // Send the Username/Password request
                s.Send(request, nIndex, SocketFlags.None);
                // Receive 2 byte response...
                nGot = s.Receive(response, 2, SocketFlags.None);
                if (nGot != 2)
                    throw new ConnectionException("Bad response received from proxy server.");
                if (response[1] != 0x00)
                    throw new ConnectionException("Bad Usernaem/Password.");
            }
            // This version only supports connect command. 
            // UDP and Bind are not supported.

            // Send connect request now...
            nIndex = 0;
            request[nIndex++] = 0x05;    // version 5.
            request[nIndex++] = 0x01;    // command = connect.
            request[nIndex++] = 0x00;    // Reserve = must be 0x00

            if (destIP != null)
            {// Destination adress in an IP.
                switch (destIP.AddressFamily)
                {
                    case AddressFamily.InterNetwork:
                        // Address is IPV4 format
                        request[nIndex++] = 0x01;
                        rawBytes = destIP.GetAddressBytes();
                        rawBytes.CopyTo(request, nIndex);
                        nIndex += (ushort)rawBytes.Length;
                        break;
                    case AddressFamily.InterNetworkV6:
                        // Address is IPV6 format
                        request[nIndex++] = 0x04;
                        rawBytes = destIP.GetAddressBytes();
                        rawBytes.CopyTo(request, nIndex);
                        nIndex += (ushort)rawBytes.Length;
                        break;
                }
            }
            else
            {// Dest. address is domain name.
                request[nIndex++] = 0x03;    // Address is full-qualified domain name.
                request[nIndex++] = Convert.ToByte(destAddress.Length); // length of address.
                rawBytes = Encoding.Default.GetBytes(destAddress);
                rawBytes.CopyTo(request, nIndex);
                nIndex += (ushort)rawBytes.Length;
            }

            // using big-edian byte order
            byte[] portBytes = BitConverter.GetBytes(destPort);
            for (int i = portBytes.Length - 1; i >= 0; i--)
                request[nIndex++] = portBytes[i];

            // send connect request.
            s.Send(request, nIndex, SocketFlags.None);
            s.Receive(response);    // Get variable length response...
            if (response[1] != 0x00)
                throw new ConnectionException(errorMsgs[response[1]]);
            // Success Connected...
            return s;
        }
    }
}


http://www.codeproject.com/cs/internet/zasocks5proxy.asp


--------------------
user posted image
PM MAIL WWW   Вверх
enginer
Дата 20.1.2007, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 16.1.2007

Репутация: нет
Всего: 1



ну да, эт я там видел. и даже слил. но что с этим делать мне не совсем понятно: то ли этот класс нужен только для подключения, а дальше вся работа с прокси ведется ручками, то ли после подключения можно забыть что подключение осуществляется через прокси и делать все как обычно... а еще мне все таки хотелось бы найти примерчик для ХТТП прокси. Потому как для меня совершенно не понятно как связать Socket и WebProxy.

Это сообщение отредактировал(а) enginer - 20.1.2007, 16:15
PM MAIL   Вверх
Ламо
Дата 19.2.2007, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 27.12.2006

Репутация: нет
Всего: нет



А можно ли из WebReqest вытащить сокет? или я ерунду сморозил? а?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
cully
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, cully, mr.DUDA, Exception.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Распределённые приложения и сеть | Следующая тема »


 




[ Время генерации скрипта: 0.0757 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.