System.Net.IPAddress возвращает странные адреса - PullRequest
2 голосов
/ 03 августа 2011

Я пишу (довольно простое :) сетевое приложение и тестирую его, используя localhost:27488 (127.0.0.1:27488).
Я использую System.Net.Sockets.TcpClient для соединения, которое требует System.Net.IPAddress дляуказать хост ... единственное, я не могу понять, как инициализировать класс с правильным IP-адресом.Я просмотрел документы MSDN, и там говорится, что для адреса требуется Byte(4) или Int64 (long).
Проблема заключается в том, что когда я инициализирую IPAddress следующим образом:

Dim ipAddr As New System.Net.IPAddress(127001)

возвращает адрес как 25.240.1.0.Из того, что я понимаю из документов, 127001 должно возвращаться 127.0.0.1 ... Может я что-то там пропустил?http://msdn.microsoft.com/en-us/library/13180abx.aspx

Ответы [ 3 ]

5 голосов
/ 03 августа 2011

Вы неправильно понимаете, как это работает.IP-адрес состоит из 4 байтов, представляя их как 127.0.0.1 - просто удобочитаемое соглашение.Под капотом 127.0.0.1 представлен как ((127 << 24) | (0 << 16) | (0 << 8) | 1).В вашем случае было бы намного проще и удобочитаемее просто использовать .Parse(string) метод, подобный этому:

IPAddress.Parse("127.0.0.1");

4 голосов
/ 03 августа 2011

Краткий ответ: используйте взамен TcpClient.Connect (String, Int);он принимает IPv4 / IPv6-адрес или имя хоста / псевдоним, поэтому вы не ограничены подключением по IP.Например:

Dim client As TcpClient
client.Connect( "localhost", 27488 )
client.Connect( "127.0.0.1", 27488 )

Но откуда взялась 25.240.1.0?Попробуйте следующее:

  • Откройте Calc, переключитесь в режим программирования, выберите Dec
  • Введите 127001, затем переключитесь на Hex
  • Запишите результат,добавление нулей слева для заполнения до 4 байтов / 32 бита: 0001F019
  • Разделите это число на отдельные байты: 00 01 F0 19
  • Обратный порядок байтов: 19 F0 01 00
  • Преобразовать каждый байт обратно в десятичный: 25 240 1 0
  • С точками: 25.240.1.0

Зачем инвертировать байты?Ваша архитектура процессора имеет младший порядок;числа представляются в памяти с младшим байтом первым.Адреса IPv4 стандартизированы в формате с прямым порядком байтов (сначала старший байт; он же порядок сети).Конструктор IPAddress( Int64 ) обращает байты для преобразования из LE в BE.

В обратном порядке, описанном выше, правильное значение для обратной петли в конструкторе IPAddress( Int64 ) будет &H0100007F (hex) или 16777343(десятичный).

Конструктор IPAddress( Byte[4] ) принимает массив байтов в сетевом порядке, так что это будет New Byte() { 127, 0, 0, 1 }

2 голосов
/ 03 августа 2011

Почему бы не попробовать метод IPAddress.Parse ?

Вы бы сделали что-то вроде:

Dim ipAddr as IPAddress = IPAddress.Parse("127.0.0.1")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...