Работа приложение через прокси [Delphi]

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by FairHawk, 17 Jun 2010.

  1. FairHawk

    FairHawk Member

    Joined:
    16 Mar 2010
    Messages:
    46
    Likes Received:
    6
    Reputations:
    0
    Работа с IRC через прокси [Delphi]

    Народ, как реализовать поддержку прокси в приложении, на пример для работы с irc ?
     
    #1 FairHawk, 17 Jun 2010
    Last edited: 18 Jun 2010
  2. akimov_aleks

    akimov_aleks New Member

    Joined:
    3 May 2009
    Messages:
    39
    Likes Received:
    1
    Reputations:
    0
    IdHTTP1.ProxyParams.ProxyServer:=ip;
    IdHTTP1.ProxyParams.ProxyPort:=port;
    все подобное
     
  3. slesh

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

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    2 FairHawk зависит от того каким образом ты работаешь с сетью.
    WinInet, WinSock, Urlmon, VCL Компоненты, Curl .
    Для каждого случая свои меры
     
  4. FairHawk

    FairHawk Member

    Joined:
    16 Mar 2010
    Messages:
    46
    Likes Received:
    6
    Reputations:
    0
    akimov_aleks спс
    slesh indy - TIdIRC
     
  5. xafon

    xafon New Member

    Joined:
    2 Dec 2009
    Messages:
    38
    Likes Received:
    4
    Reputations:
    0
    slesh, воспользуясь темой, можешь скинуть пример на winsock'e?
     
  6. slesh

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

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    ну зависит от того что за прокси ты юзать собрался. Socks4/5 или HTTP(CONNECT)
     
  7. Meecript_

    Meecript_ Banned

    Joined:
    29 Oct 2008
    Messages:
    194
    Likes Received:
    62
    Reputations:
    32
    Вот пример для socks5:
    PHP:
      /********************************************************************************
      *                                                                               *
      *    Эта программа демонстрирует работу с SOCKS5-сервером                       *
      *                                                                               *
      *    Вы имеете право распространять эту программу при условии, что              *
      *    этот коментарий не будет удален                                            *
      *                                                                               *
      *    Copyright Mr.Black  mailto:[email protected]                               *
      *                                                                               *
      ********************************************************************************/

      #include <winsock2.h>
      #include <stdio.h>
      #include <stdlib.h>

      
    class CTSocket
      
    {
        public:
          
    virtual BOOL CreateSocket();
          
    virtual BOOL Connect(unsigned long ipunsigned short port);
          
    virtual BOOL Connect(LPCSTR nameunsigned short port);
          
    virtual int Send(const charstrint len);
          
    virtual int Recv(charbufint max);
          
    virtual void Close();
          
    virtual unsigned long GetHost(); // Узнать свой адрес. Это тоже может понадобиться.

        
    private:
          
    SOCKET sock;
      };

      
    BOOL CTSocket::CreateSocket()
      {
           return (
    sock socket(AF_INETSOCK_STREAM0)) != NULL;
      }

      
    BOOL CTSocket::Connect(unsigned long ipunsigned short port)
      {
          
    SOCKADDR_IN addr;
          
    memset(&addr0sizeof(addr));
          
    addr.sin_family AF_INET;
          
    addr.sin_addr.S_un.S_addr ip;
          
    addr.sin_port port;
          return 
    connect(sock, (SOCKADDR*)&addrsizeof(addr)) == 0;
      }

      
    BOOL CTSocket::Connect(LPCSTR nameunsigned short port)
      {
          
    HOSTENTgethostbyname(name);
          if (
    == NULL) return FALSE;
          return 
    Connect(p->h_addr_list[0], port);
      }

      
    int CTSocket::Send(const charstrint len)
      {
          return 
    send(sockstrlen0);
      }

      
    int CTSocket::Recv(charbufint max)
      {
          return 
    recv(sockbufmax0);
      }

      
    void CTSocket::Close()
      {
          
    closesocket(sock);
      }

      
    unsigned long CTSocket::GetHost()
      {
          
    SOCKADDR_IN addr;
          
    int cbName sizeof(addr);
          if (
    getsockname(sock, (SOCKADDR*)&addr, &cbName) == 0)
          {
              return 
    addr.sin_addr.S_un.S_addr;
          } else return 
    0;
      }


      class 
    CSocksSocket : public CTSocket
      
    {
        public:
          
    virtual BOOL CreateSocket();
          
    virtual BOOL Connect(unsigned long ipunsigned short port);
          
    virtual BOOL Connect(LPCSTR nameunsigned short port);
          
    virtual int Send(const charstrint len);
          
    virtual int Recv(charbufint max);
          
    virtual void Close();
          
    virtual unsigned long GetHost();

         
    CTSocketpSocket;
         
    unsigned long socks_ip;
         
    unsigned short socks_port;

        private:
          
    char buffer[512];     // Такого размера точно хватит
          
    unsigned long l_ip;   // Адрес, возвращаемый функцией GetHost()
      
    };

      
    // Реализация
      
    BOOL CSocksSocket::CreateSocket()
      {
         if (!
    pSocket->CreateSocket()) return FALSE;
         if (!
    pSocket->Connect(socks_ipsocks_port)) return FALSE;
         
    buffer[0] = 5;  // Ver
         
    buffer[1] = 1;  // 1 method
         
    buffer[2] = 0;  // no auth
         
    pSocket->Send(buffer3);
         
    int n pSocket->Recv(buffer2);
         if (
    != 2) return FALSE;
         if (
    buffer[1] != 0) return FALSE;  // method 0 not supported
         
    return TRUE;
      }

      
    BOOL CSocksSocket::Connect(unsigned long ipunsigned short port)
      {
         
    buffer[0] = 5;  // Ver
         
    buffer[1] = 1;  // CONNECT
         
    buffer[2] = 0;  // Reserved
         
    buffer[3] = 1;  // IPv4
         
    *((unsigned long*)(buffer 4)) = ip;
         *((
    unsigned short*)(buffer 8)) = port;
         
    pSocket->Send(buffer10);
         
    int n pSocket->Recv(buffer10);
         if (
    != 10) return FALSE;
         if (
    buffer[1] != 0) return FALSE// Can't connect
         
    if (buffer[3] != 1) return FALSE// Будем требовать, чтобы нам сказали IP, а не что-нибудь другое.
         
    l_ip = *((unsigned long*)(buffer 4));
         return 
    TRUE;
      }

      
    BOOL CSocksSocket::Connect(LPCSTR nameunsigned short port)
      {
         
    buffer[0] = 5;
         
    buffer[1] = 1;
         
    buffer[2] = 0;
         
    buffer[3] = 3;  // Domain name
         
    int m strlen(name);
         
    buffer[4] = m;  // Length byte
         
    memcpy(buffer+5namem); // Копируем строку без завершающего нуля
         
    *((unsigned short*)(buffer m)) = port;
         
    pSocket->Send(buffer7);
         
    int n pSocket->Recv(buffer10);
         if (
    != 10) return FALSE;
         if (
    buffer[1] != 0) return FALSE;
         if (
    buffer[3] != 1) return FALSE// Будем требовать, чтобы нам сказали IP, а не что-нибудь другое.
         
    l_ip = *((unsigned long*)(buffer 4));
         return 
    TRUE;
      }

      
    int CSocksSocket::Send(const charstrint len)
      {
         return 
    pSocket->Send(strlen);
      }

      
    int CSocksSocket::Recv(charbufint max)
      {
         return 
    pSocket->Recv(bufmax);
      }

      
    void CSocksSocket::Close()
      {
         
    pSocket->Close();
      }

      
    unsigned long CSocksSocket::GetHost()
      {
         return 
    l_ip;
      }

      
    // Ну, а теперь тестовая прога
      
    void main()
      {
        
    WSADATA wsadata;
        
    CTSocket tsock;
        
    CSocksSocket ssock;
        
    ssock.pSocket = &tsock;

        
    WSAStartup(MAKEWORD(2,2), &wsadata);   

        
    ssock.socks_ip inet_addr("68.57.150.240"); // Впишите сюда нужный адрес
        
    ssock.socks_port htons(1180); // Впишите сюда порт
        
        
    if (!ssock.CreateSocket()) return;    // Can't connect to socks
                        // or auth required
        
    if (!ssock.Connect("www.mail.ru"htons(80))) return; // www.mail.ru 
                                  // is inaccessible
        
    LPSTR q "HEAD / HTTP/1.1\xD\xAHost: www.mail.ru:80\xD\xAUser-Agent: xakep\xD\xA\xD\xA";
        
    ssock.Send(qstrlen(q));

        
    char buf[1000];
        
    int n ssock.Recv(buf1000);
        
    buf[n] = 0;
        
    printf("%s"buf);

        
    ssock.Close();
        
    WSACleanup();
      }
        
     
  8. FairHawk

    FairHawk Member

    Joined:
    16 Mar 2010
    Messages:
    46
    Likes Received:
    6
    Reputations:
    0
    А можно примеры на Delphi, для Socks4/5
     
  9. GhostOnline

    GhostOnline Active Member

    Joined:
    20 Dec 2008
    Messages:
    723
    Likes Received:
    110
    Reputations:
    22
    winsock он и в африке winsock, хоть в дельфи хоть в С, чем тебя пример M_script_'a не устраивает?
     
  10. slesh

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

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    а вообще надо уметь поиском пользоваться, я когдато даавно тут выкладывал чтото типа телнета работающего через socks5
     
  11. FairHawk

    FairHawk Member

    Joined:
    16 Mar 2010
    Messages:
    46
    Likes Received:
    6
    Reputations:
    0
    Изменил название топа.
    Нужно реализовать работу с IRC через socks 4/5