Может ли Dns.GetHostEntry когда-либо возвращать IPHostEntry с пустым списком адресов? - PullRequest
2 голосов
/ 01 октября 2008

Мне просто интересно, может ли быть случай, когда имя хоста может быть успешно разрешено, но возвращенный hostEntry.AddressList пуст.

В настоящее время я делаю что-то вроде этого:

IPHostEntry hostEntry = Dns.GetHostEntry("some.hostname.tld");
if (hostEntry.AddressList.Count() < 1)
{
  // can that ever happen?
  throw new ArgumentException("hostName has no assigned IP-Address");
}
TcpClient client = new TcpClient(hostEntry.AddressList[0], 1234);

Я предполагаю, что Dns.GetHostEntry выдает исключение, если имя хоста не найдено, или иначе AddressList не пуст, но я не уверен в этом.

Ответы [ 4 ]

1 голос
/ 01 октября 2008

Нет, вы не увидите пустой список адресов: даже если вы запросите метку DNS, которая существует, но не имеет записей A или AAAA (IPv6), SocketException («Такой хост не известен») будет выброшены.

В этом можно убедиться, посмотрев на функцию InternalGetHostByName(string hostName, bool includeIPv6) в DNS.cs из выпуска .NET Reference Source. За исключением некоторых мер предосторожности для конкретной платформы, DNS-запросы являются простой оболочкой для функции Winsock gethostbyname .

Gethostbyname либо потерпит неудачу, либо вернет список адресов. Пустой список адресов никогда не возвращается, потому что в этом случае функция завершится с WSANO_DATA («Допустимое имя, нет записи данных запрошенного типа»), что означает исключение сокета, которое мы уже видели в .NET.

РЕДАКТИРОВАТЬ, май 2012 г., в ответ на ответы о том, что пустой список все равно возвращается: обратите внимание, что этот ответ относится только к Win32, и что платформы, такие как WinCE, могут вести себя совершенно по-другому. Если вы видите поведение «пустого списка» на Win32 и ваш запрос направлен на общедоступный DNS-сервер, пожалуйста, опубликуйте свой код ...

1 голос
/ 01 октября 2008

Только для записей.

Благодаря принятому ответу mdb Я посмотрел описание ошибки WSANO_DATA :

Запрошенное имя является действительным и было найдено в базе данных, но оно делает не имеют правильных связанных данных, для которых разрешается. Обычный пример это попытка преобразования имени хоста в адрес (с помощью gethostbyname или WSAAsyncGetHostByName), который использует DNS (сервер доменных имен). Запись MX возвращается, но нет записи A - указывает, что сам хост существует, но не прямой доступ.

Так что это в значительной степени отвечает на мой вопрос:)

0 голосов
/ 13 августа 2016

Ответ ДА . Метод GetHostEntry запрашивает у DNS-сервера IP-адреса и псевдонимы, связанные с IP-адресом.

Адреса IPv6 фильтруются из результатов метода GetHostEntry, если на локальном компьютере не установлен IPv6. В результате можно получить пустой экземпляр IPHostEntry, если для параметра адреса доступен только IPv6.

Свойство Aliases возвращенного экземпляра IPHostEntry не заполняется этим методом и всегда будет пустым.

0 голосов
/ 01 октября 2008

У вас есть три возможных ситуации здесь:

  1. Имя хоста существует (DNS имеет запись A) и преобразуется в IP-адрес

    • Состояние никогда не достигается
  2. Имя хоста существует (DNS знает о домене), однако записей A не существует.

    • Это крайне маловероятный сценарий, и я думаю, что этого никогда не произойдет.
  3. Имя хоста не существует

    • Исключение выдается, вы никогда не получите там.

Так что нет, я не думаю, что это когда-либо случится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...