На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
> сокеты и прокси , где указывать прокси
    Вот пишу я клиента TCP

    ExpandedWrap disabled
      Socket TempSocket = new Socket(AddressFamily.InterNetwork,
      SocketType.Stream, ProtocolType.Tcp);
      IPEndPoint ipep = new IPEndPoint(
      IPAddress.Parse(AdressOfServer), 9050);
      TempSocket.BeginConnect(ipep, new AsyncCallback(Connected), TempSocket);


    А что если программа запустится и попытается подконнектиться на компьютере, который имеет выход в интернет через прокси? Мы ведь нигде этого не указываем в подключении в коде. Например браузеру, чтобы он смог коннектиться в интернет указывается в настройках прокси(если комп выходит в инет через прокси), а иначе он не сможет установить соединение. Моя программа я так понимаю тоже не сможет подконнектиться, тогда как с использованием сокетов указать, что выход будет через прокси?
      Пиши в Microsoft .NET Framework SDK слово Proxy
      и у тебя так столько классов для работы с прокси и его созданию выпадет.
        но я сецчас говорю о классе socket, и как используя класс cocket указать, что мы хотим использовать прокси.
          Делай наследника этих классов
            Скрести их :)
              Я делал на VC++ 6.0 приложение которое было основано на сокетах и работало в сети с прокси сервером. Маленькое "но" - мое приложение работало только с вэб, т.е. соединения шли на 80 порт.
              Реализовано все было следующим образом:
              1. Создать сокет, IP адрес получателя - адрес прокси-сервера, порт получателя - порт прокси - сервера
              2. Сформировать НТТР запрос к ресурсу, на пример
              GET /some_page.html HTTP/1.1
              Host: www.host.com
              3. Выполнить Send

              Этот пример использует прокси-сервер без аутентификации. Для аутентификации на сервере НТТР запрос должен быть несколько изменен.
              Если найду, выложу исходник своего приложения.
                Цитата
                Host: www.host.com

                А что за хост? При работе с сокетами, вроде нигде этого не указывается.
                  В описаном мною примере НТТР запрос отправляется прокси серверу, который перенаправляет его на необходимый узел. В моем случае это www.host.com. Я ведь указал что это пример для работы с веб-сервером.
                    Цитата kosten_spb @ 28.12.04, 18:13
                    В описаном мною примере НТТР запрос отправляется прокси серверу, который перенаправляет его на необходимый узел. В моем случае это www.host.com. Я ведь указал что это пример для работы с веб-сервером.

                    Спасибо. ;)

                    Добавлено
                    кстати, если кому интересно, то на codeproject.com нарыл класс, который реализует оболчку над Socket работающий по протоколу SOCKS5.
                    ExpandedWrap disabled
                      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;
                      }
                      }
                      }
                    Сообщение отредактировано: Gazon -
                    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                    0 пользователей:


                    Рейтинг@Mail.ru
                    [ Script execution time: 0,0567 ]   [ 16 queries used ]   [ Generated: 27.04.24, 03:06 GMT ]