Winsock+socks5

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

  1. denjf

    denjf Member

    Joined:
    12 Nov 2008
    Messages:
    88
    Likes Received:
    12
    Reputations:
    -1
    Кто знающий? Можите привести простой пример отправки http запроса через socks5 при помощи winsock.

    На форуме нашел только одну тему с таким примером
    https://forum.antichat.ru/thread178458.html
    но как то глючно там все работает, допустим с http://awmproxy.com/ чекаю не одного нармально сокса, такое ведь не может быть.
     
  2. Neo][acK

    Neo][acK New Member

    Joined:
    27 Mar 2009
    Messages:
    3
    Likes Received:
    0
    Reputations:
    0
    сам get запрос:
    Code:
    GET / HTTP/1.0+#13#10+
    Host: www.google.com+#13#10#13#10
    немного переделанный и теперь рабочий код из той темы:
    Code:
    procedure TProxyCheckThread.Execute;
    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
     //приветствие
     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(form1.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(form1.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
       // сработал таймаут
    
       synchronize(showresultbad);
     end
    else
     begin
       // удачно соединились
      // запрос для http 
       send_buf:='GET / HTTP/1.0'#13#10+
                  'Host: '+form1.edit2.Text+#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 synchronize(showresultgood);
    
     end;
      closesocket(sock);
      synchronize(dec_count);
    end;
     
    #2 Neo][acK, 19 Sep 2010
    Last edited: 19 Sep 2010