Определить тип прокси. Winsock.

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Sifon110, 10 Mar 2013.

  1. Sifon110

    Sifon110 New Member

    Joined:
    13 Mar 2011
    Messages:
    34
    Likes Received:
    1
    Reputations:
    0
    Прочитал, что определить тип прокси можно подключившись по ип и порту, отправив следующею комбинацию:

    0x05
    0x01
    0x00

    Тогда мол, если это сокс прокси, он вернет в ответе версию и другую информацию. Если вернет что-то другое, то это не сокс.

    Посылаю эту комбинацию таким образом:

    Code:
    socket1:=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    FillChar(addr, SizeOf(sockaddr_in), 0);
    addr.sin_family:=AF_Inet;
    addr.sin_port:=htons(port);
    addr.sin_addr.S_addr:=inet_addr(Pchar(ip));
    block:=true;
    ioctlsocket(socket1, FIONBIO, cardinal(block));
    err:=0;
    
     while err<3 do
      begin
       if Connect(socket1,addr,SizeOf(TSockAddrin))=SOCKET_ERROR then
        begin
         if WSAGetLastError=WSAEWOULDBLOCK then 
          begin
           FD_ZERO(fds);
           FD_SET(socket1, fds);
           tv.tv_sec := time;
           tv.tv_usec := 0;
           er:=select(0, nil, @fds, nil, @tv);
         end;
        end;
        block:=false;
        ioctlsocket(socket1, FIONBIO, cardinal(block));
    	
    	if er>=1 then
    	 break
    	else
    	 inc(err);
    	 
      end;
      
      if err<>3 then 
       begin
        data:='0x05'+#13#10+
        '0x01'+#13#10+
        '0x00';
        send(socket1, data[1] ,length(data), 0);
        rep:=reply(socket1);
        closesocket(socket1);
       end
      else
       closesocket(socket1);
    
    Но сервер никак на нее не реагирует и ничего не возвращает. Прошу помощи, как правильно сделать или подскажите что почитать.
     
  2. alexey-m

    alexey-m Elder - Старейшина

    Joined:
    15 Jul 2009
    Messages:
    518
    Likes Received:
    100
    Reputations:
    37
    Sifon110, для начала хотя бы RFC1928 (en | ru) прочитал, тогда вопросы чего и как отправлять отпали сразу =)

    а так упрощенно, конкретно для твоего способа:
    Code:
    type
      TSocks = packed record
        ver: Byte;
        nMethods: Byte;
        Methods: Byte;
      end;
      
    procedure _sendSocks();
    var
      hdr: TSocks;
      ............
    begin
      ............
      hdr.ver:= 5;
      hdr.nMethods:= 1;
      hdr.Methods:= 0;
      iResult:= send(hSocket, hdr, sizeof(TSocks), 0);
      if (iResult = SOCKET_ERROR) then begin
      ............
    end;