[Delphi] WinSock get request & socks5 proxy

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by cheater_man, 6 Dec 2011.

  1. cheater_man

    cheater_man Member

    Joined:
    13 Nov 2009
    Messages:
    651
    Likes Received:
    44
    Reputations:
    7
    Нашел пару примеров работы винсок через прокси, но не один из них не пашет=(
    Может кто что-то подскажет, может у кого-то есть свой класс, может кто ссылкой поделится
    вот что я использую:
    Code:
    var
     sock:LongWord;
     block:u_long;
     SockAddrIn:TSockAddrIn;
     timeout:ttimeval;
     fds:TFDSet;
     rc,curr,len:integer;
     ws:TWSAData;
     send_buf, result:string;
     buf:array[0..4095] of char;
    
     socks5_r:record // привет
       ver:byte;
       nmet:byte;
       met:byte;
       end;
    
      socks5_r_TPC:record // куда подключаться
        ver:byte;
        cmd:byte;
        rsv:byte;
        atyp:byte;
        ip:u_long;
        port:u_short;
      end;
    
    begin
     //приветствие
     PROXY_IP:='109.230.246.24';
     PROXY_PORT:='11721';
     socks5_r.ver:=5;
     socks5_r.nmet:=1;
     socks5_r.met:=0;
     WsaStartup($202,ws);
     //запрос соединения
     socks5_r_TPC.ver:=5;
     socks5_r_TPC.cmd:=1;
     socks5_r_TPC.rsv:=0;
     socks5_r_TPC.atyp:=1;
     socks5_r_TPC.ip:=inet_addr(Pansichar(GetipAddress('mail.ru')));//Form2.edit2.Text)));
     socks5_r_TPC.port:=htons(80);
    
     block:=1;
     sock:=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
     if sock=LongWord(-1) then exit;
     SockAddrIn.sin_family := AF_INET;
     SockAddrIn.sin_port := htons(strtoint(PROXY_PORT));
     SockAddrIn.sin_addr.s_addr := inet_addr(Pansichar(PROXY_IP));
    
     ioctlsocket(sock, FIONBIO, block); // переводим сокет в неблокируемый режим
     if connect(sock, SockAddrIn, SizeOf(SockAddrIn))=SOCKET_ERROR then // пытаемся подключиться
      begin
       if WSAGetLastError=WSAEWOULDBLOCK then // проверяем что сокет перешел в неблокируемый режим
         begin
          FD_ZERO(fds);
          FD_SET(sock,fds);
          timeout.tv_sec:=strtoint('1000');//(form2.Edit1.Text); // наш таймаут
          timeout.tv_usec:=0;
          rc:=select(0, nil, @fds, nil, @timeout); // ожидаем
         end;
       end;
     block:=0;
     ioctlsocket(sock, FIONBIO, block); // переводим сокет обратно в блокируемый режим
    if rc=0 then
     begin
       // сработал таймаут
    
       showmessage('showresultbad');
     end
    else
     begin
       // удачно соединились
      // запрос для http
       send_buf:='GET http://'+'mail.ru'+'/ HTTP/1.1'#13#10+
                  'Host: '+'mail.ru'+#13#10+
                  'Accept: */*'+#13#10+
                  'Proxy-Connection: Keep-Alive'+#13#10+
                  'User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; MRA 4.7 (build 01670); Crazy Browser 1.0.5; .NET CLR 1.1.4322; .NET CLR 2.0.50727)'#13#10#13#10;
    
    
        send(sock,socks5_r, 3,0); // шлем привет
              len := recv(sock, socks5_r, 2, 0); // считали данные
    
              if len > 0 then // если есть чтото
              begin
                //смотрим результат
                if (socks5_r.ver=5) and(socks5_r.met=0) then //успех
                  begin
    
                    send(sock, socks5_r_TPC, 10,0); // запрос на соединение с http сервом
                    len := recv(sock,  socks5_r_TPC, 10, 0); // считали данные
                    if len > 0 then
                      if socks5_r_TPC.cmd=0 then //успех
                        begin
    
                             send(sock, send_buf[1], length(send_buf),0); // шлем наднные http серву через прокси
                                 len := recv(sock,  buf, 4096, 0); // читаем ответ
                                 if len > 0 then
                                  begin
                                    result := copy(buf, 0, len);
                                    if pos('200 OK', result)<>0 then result:='GOOD';
                                  end;
                        end;
    
                  end;
    
              end;
         if result='GOOD' then showmessage('showresultgood'); //synchronize(showresultgood);
    
     end;
      closesocket(sock);
      //synchronize(dec_count);
    
     
  2. Metal-Core

    Metal-Core Member

    Joined:
    20 Sep 2011
    Messages:
    226
    Likes Received:
    21
    Reputations:
    0
    Делай не синопсе!
     
  3. cheater_man

    cheater_man Member

    Joined:
    13 Nov 2009
    Messages:
    651
    Likes Received:
    44
    Reputations:
    7
    Ты по моему вопрос не правильно понял... WinSock нужен
     
  4. cheater_man

    cheater_man Member

    Joined:
    13 Nov 2009
    Messages:
    651
    Likes Received:
    44
    Reputations:
    7
    Неужели ни кто не знает? slesh хоть ты помоги=)
     
  5. xophet

    xophet Member

    Joined:
    16 Apr 2011
    Messages:
    617
    Likes Received:
    49
    Reputations:
    5
    Ой какая глупость, самому лень разобраться, а думаете у slesh'a много времени в чужом коде колупаться?

    Ссылочку в Goooooooogle нашел. Socks5 прокси с аутентификацией по логину и паролю на сокетах
    http://www.proxy-base.org/f29/delphi_socks5_ishodnik-9600.html
    Запустил, проверил. Работает. Через раз.
    Почему? Предстоит Вам разобраться ;)
     
  6. greki_hoy

    greki_hoy Member

    Joined:
    4 Mar 2010
    Messages:
    326
    Likes Received:
    57
    Reputations:
    41
    http://en.pudn.com/search_db.asp?keyword=socks
     
    1 person likes this.