Получение версии прокси C#

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by inCode, 16 Nov 2011.

  1. inCode

    inCode Member

    Joined:
    20 Jun 2011
    Messages:
    141
    Likes Received:
    22
    Reputations:
    5
    Столкнулся с проблемой определения версии прокси.

    Code:
      public static ProxyType GetProxyVersion(string proxy)
            {
                string[] values = proxy.Split(':');
    
                IPEndPoint ipep = new IPEndPoint(
                        IPAddress.Parse(values[0]), Convert.ToInt32(values[1]));
                Socket server = new Socket(AddressFamily.InterNetwork,
                        SocketType.Stream, ProtocolType.Tcp);
                try
                {
                    server.Connect(ipep); //аутентификация
                    
    
    
                    server.Send(Encoding.ASCII.GetBytes("data"));
                    byte[] data = new byte[1024];
                    int receivedDataLength = server.Receive(data);
                    var u =server.Available; 
                    string stringData = Encoding.ASCII.GetString(data, 0, receivedDataLength);
                    server.Shutdown(SocketShutdown.Both);
                }
                catch (SocketException e)
                {
    
                }
    
                server.Close();
    
    
                return ProxyType.None;
            }
    
    

    Следовательно метод Connect в данном случае и есть подключение к серверу, но возвращает булевое значение.

    Так же у сокета имеется свойство Available, которое по идеи должно возвращать байты при Connect. Но этого не происходит.

    В итоге получается не совсем корректная работа класса Сокет? :confused:

    А так же подскажите пожалуйста в какую сторону хотя бы копать. :)

    Заранее благодарен.
     
  2. Niades

    Niades New Member

    Joined:
    30 Nov 2010
    Messages:
    28
    Likes Received:
    3
    Reputations:
    0
    Метод Connect не возвращает ничего.
    Свойство Available возвращает значение, указывающее количество полученных из сети и доступных для чтения данных.
    Всё правильно работает.

    Я вообще не понимаю, что именно ты хочешь сделать. Определить SOCKS5 это или SOCKS4? Читай вот это:
    http://ru.wikipedia.org/wiki/SOCKS
     
  3. inCode

    inCode Member

    Joined:
    20 Jun 2011
    Messages:
    141
    Likes Received:
    22
    Reputations:
    5
    смотрел еще до создания темы :rolleyes:
    Code:
    
                try
                {
                    server.Connect(ipep); 
                    //если подключение выполнено идем дальше.
                    
                    var u =server.Available;  //следовательно здесь должна быть информация конекта, а именно 2-ое поле\1 байт и есть версия. Но это не работает :)
    
                }
                catch (SocketException e)
                {
                 //подключение не выполнено
    }
    
    
     
  4. Niades

    Niades New Member

    Joined:
    30 Nov 2010
    Messages:
    28
    Likes Received:
    3
    Reputations:
    0
    Там должно быть количество данных, а не данные.
     
  5. inCode

    inCode Member

    Joined:
    20 Jun 2011
    Messages:
    141
    Likes Received:
    22
    Reputations:
    5
    тогда возникает вопрос, как же все же можно получить эти данные? Потом уже вытянуть версию не проблема :)
     
  6. X-rus

    X-rus Member

    Joined:
    22 Dec 2010
    Messages:
    88
    Likes Received:
    22
    Reputations:
    4
    Нужно прочитать ещё раз внимательно описание протокола Socks.
     
  7. St0nX

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

    Joined:
    19 May 2007
    Messages:
    257
    Likes Received:
    46
    Reputations:
    0
    Почитай для начала RFC. Думаю дальше вопросов не возникнет.
     
  8. Niades

    Niades New Member

    Joined:
    30 Nov 2010
    Messages:
    28
    Likes Received:
    3
    Reputations:
    0
    Socket.Receive()/Socket.BeginReceive()=>Socket.EndReceive()
    или
    TcpClient.GetStream().Read()/TcpClient.GetStream().BeginRead()=>TcpClient.GetStream().EndRead()