работа с сокетом через прокси в С/С++

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by KSoniX, 25 Mar 2008.

  1. KSoniX

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

    Joined:
    17 Jan 2008
    Messages:
    94
    Likes Received:
    12
    Reputations:
    1
    вот мой код мне надо чтобы он работал через прокси и чтобы задавалось имя пользователя и его пасс и он делал коннект через прокси
    Code:
    ///.........................................................
    int main()
    {
    ///.........................................................
    WSADATA wsaData;
        WSAStartup(MAKEWORD(2,0),&wsaData);
        SOCKET    sClient;
        char    szBuffer[1024];
        int    ret;
        struct sockaddr_in server;
        struct hostent    *host = NULL;
        char szServerName[1024];
        
        strcpy(szServerName, "192.168.0.1");
    
        // Создание сокета
        sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
        if (sClient == INVALID_SOCKET)
        {
            
            return 1;
        }
        // Заполнение структуры с адресом сервера и номером порта
        server.sin_family = AF_INET;
        server.sin_port = htons(80);
        server.sin_addr.s_addr = inet_addr(szServerName);
    
        // Если указано имя, то перевод символьного адреса сервера в IP
        if (server.sin_addr.s_addr == INADDR_NONE)
        {
            host = gethostbyname(szServerName);
            if (host == NULL)
            {
                
                return 1;
            }
            CopyMemory(&server.sin_addr, host->h_addr_list[0],
                host->h_length);
        }
        // Соединение с сервером
        if (connect(sClient, (struct sockaddr *)&server,
            sizeof(server)) == SOCKET_ERROR)
        {
            
            return 1;
        }
    //................................................................
    }
    
    //................................................................
    
    если можна по быстрей PLS
     
    1 person likes this.
  2. krypt3r

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

    Joined:
    27 Apr 2007
    Messages:
    1,507
    Likes Received:
    389
    Reputations:
    101
    Программа-то что делает? Запрашивает некий Url? Если так, то коннект делай к проксе, а в гет/пост укажи урл к запрашиваемому сайту.
     
  3. KSoniX

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

    Joined:
    17 Jan 2008
    Messages:
    94
    Likes Received:
    12
    Reputations:
    1
    krypt3r клиент подключается к серверу через прокси и он должн зарегится в прокси сервере
     
  4. krypt3r

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

    Joined:
    27 Apr 2007
    Messages:
    1,507
    Likes Received:
    389
    Reputations:
    101
    Авторизация на прокси происходит внутри GET/POST-запроса в поле
    Code:
    Proxy-Authorization: Basic bG9naW46cGFzcw==\r\n
    где bG9naW46cGFzcw== - это логин и пасс, разделенные двоеточием и закодированные в Base64
     
  5. KSoniX

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

    Joined:
    17 Jan 2008
    Messages:
    94
    Likes Received:
    12
    Reputations:
    1
    krypt3r куда я его поставлю в моем случае
    у меня ест имя пользователя и его пасс но как его задавать с помошью winsock ?
    :confused:
     
    #5 KSoniX, 25 Mar 2008
    Last edited: 25 Mar 2008
  6. KSoniX

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

    Joined:
    17 Jan 2008
    Messages:
    94
    Likes Received:
    12
    Reputations:
    1
    помогите Pls или что ни кто не знает! :)
     
  7. x0man

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

    Joined:
    24 Feb 2006
    Messages:
    33
    Likes Received:
    13
    Reputations:
    0
    Думаю стоит почтитать Rfc по Http аунтефикации...
     
    1 person likes this.
  8. sn0w

    sn0w Статус пользователя:

    Joined:
    26 Jul 2005
    Messages:
    1,021
    Likes Received:
    1,200
    Reputations:
    327
    используй WinInet API, с сокетами геморно и бессмысленно
     
  9. zythar

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

    Joined:
    16 Feb 2008
    Messages:
    517
    Likes Received:
    109
    Reputations:
    5
    вот что впринципе мона сделать. сначала приконектиться к проксе через браузер и просмотреть хидеры. потом скопипастить хидеры которые ты посылаешь в твою программу. тобишь написать что то типа этого
    Code:
    char headers[] = "хидеры которые посылаешь";
    write(s, headers, sizeof headers);
    
     
    1 person likes this.
  10. KSoniX

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

    Joined:
    17 Jan 2008
    Messages:
    94
    Likes Received:
    12
    Reputations:
    1
    всем спасибо всё получилось
     
    #10 KSoniX, 26 Mar 2008
    Last edited: 27 Mar 2008
  11. KSoniX

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

    Joined:
    17 Jan 2008
    Messages:
    94
    Likes Received:
    12
    Reputations:
    1
    я никак не магу send сделать connect нормально проходит может я HTTP запрос не правильно дал или что делаю не так?
    вот код
     
  12. krypt3r

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

    Joined:
    27 Apr 2007
    Messages:
    1,507
    Likes Received:
    389
    Reputations:
    101
    Обработку ошибок сделай и вызови GetLastError(), посмотри, что пишет
     
    2 people like this.
  13. zythar

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

    Joined:
    16 Feb 2008
    Messages:
    517
    Likes Received:
    109
    Reputations:
    5
    а откуда ты знаешь что ты не можешь делать send?
    ты сравни ret с нулем. если больше то все ок. ошибка в хидере. если меньше тогда действительно проблемы с sendом
     
    #13 zythar, 27 Mar 2008
    Last edited: 27 Mar 2008
    1 person likes this.
  14. KSoniX

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

    Joined:
    17 Jan 2008
    Messages:
    94
    Likes Received:
    12
    Reputations:
    1
    у меня ret=-1 GetLastError() не работает
    я поставил вот так но ничо не выдает
    ret = send(sClient, szMessage, strlen(szMessage), 0);
    GetLastError();
     
  15. zythar

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

    Joined:
    16 Feb 2008
    Messages:
    517
    Likes Received:
    109
    Reputations:
    5
    попробуй write-ом. покури маны GetLastError-а.
     
  16. KSoniX

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

    Joined:
    17 Jan 2008
    Messages:
    94
    Likes Received:
    12
    Reputations:
    1
    все нашел коннект не делает оказывается спасибо всем держите +
     
  17. krypt3r

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

    Joined:
    27 Apr 2007
    Messages:
    1,507
    Likes Received:
    389
    Reputations:
    101
    Ну не так же делают обработку ошибок ))
    Code:
    if ((ret = send(sClient, szMessage, strlen(szMessage), 0)) < 0)
    {
      ...
      printf ("Error: %d\n", GetLastError());
      // закрытие всего открытого - файлов, сокетов, и остановка программы
      ...
    }
    
     
    #17 krypt3r, 28 Mar 2008
    Last edited: 28 Mar 2008
    1 person likes this.
  18. KSoniX

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

    Joined:
    17 Jan 2008
    Messages:
    94
    Likes Received:
    12
    Reputations:
    1
    помогите PLS вот код с запросим HTTP конек к прокси нормально делает но
    вы даёт ошибку кагда делаю recv в buffer приходит сопшения
    вот http запрос
    что делать ? :(
     
    #18 KSoniX, 3 Apr 2008
    Last edited: 3 Apr 2008
  19. KSoniX

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

    Joined:
    17 Jan 2008
    Messages:
    94
    Likes Received:
    12
    Reputations:
    1
    я думаю что у меня с http запросом что-то ни то или в User-Agent я должен указать другой браузер?????:)
     
  20. zythar

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

    Joined:
    16 Feb 2008
    Messages:
    517
    Likes Received:
    109
    Reputations:
    5
    дело не в браузере. просто тот реквест который ты посылаешь сервак не понимает.
    попробуй отправлять хидер без написания всего этого в буффер. а откуда у тебя запрос? сам сочинял или скпипастил из браузера?