Классы .NET для IP-адресов

194

В Интернете серверы и клиенты идентифицируются по IP-адресу либо имени хоста (также известному, как DNS-имя). В общем случае, имя хоста — это дружественное для человека имя, которое вводится в поле адреса веб-браузера, такое как www.professorweb.ru или www.microsoft.com. IP-адрес — это идентификатор, используемый компьютерами для опознания друг друга. IP-адреса представляют собой идентификаторы, применяемые для обеспечения достижения запросами и ответами соответствующих машин. Один компьютер может даже иметь несколько IP-адресов.

В наше время IP-адреса обычно представлены 32-битным значением. Вот пример 32-битного IP-адреса: 192.168.1.100. Этот формат IP-адреса определен в протоколе Internet Protocol version 4.

Поскольку количество компьютеров и прочих устройств, претендующих на место в Интернете, неуклонно растет, была разработана более новая система адресации — Internet Protocol version 6. Протокол IPv6 предоставляет 64-битные IP-адреса. IPv6 потенциально может представить до 3e+28 уникальных адресов. Среда .NET Framework позволяет приложениям работать как с IPv4, так и с IPv6.

Чтобы имена хостов работали, сначала должен быть отправлен сетевой запрос на трансляцию имени хоста в IP-адрес; эту задачу решает один или более DNS-серверов.

DNS-сервер хранит таблицу, отображающую имена хостов на IP-адреса для всех известных ему компьютеров, а также IP-адреса других DNS-серверов, где можно искать имена хостов, которые ему неизвестны. Локальный компьютер должен всегда знать, по крайней мере, один DNS-сервер. Сетевые администраторы конфигурируют эту информацию при настройке компьютера.

Прежде чем отправлять запрос, компьютер сначала спрашивает у DNS-сервера IP-адрес, соответствующий введенному имени хоста. Получив корректный IP-адрес, компьютер может отправить ему запрос через сеть. Все это нормально работает "за кулисами", пока пользователь путешествует по Интернету.

В .NET Framework предлагается множество классов, которые помогают в процессе поиска IP-адресов и нахождении информации о компьютерах-хостах.

Класс IPAddress

Класс IPAddress представляет IP-адрес. Сам адрес доступен в виде свойства GetAddressBytes и может быть преобразован в десятичный формат с разделителями-точками с помощью метода ToString(). В этом классе также реализован статический метод Parse(), который эффективно выполняет преобразование, обратное ToString() — из десятичного формата с разделителями-точками в IPAddress:

IPAddress ip = IPAddress.Parse("234.58.78.9");
byte[] adress = ip.GetAddressBytes();
string ipString = ip.ToString();

В классе IPAddress есть несколько открытых, доступных только для чтения полей, которые возвращают предопределенные IP-адреса:

IPAddress.None

Возвращает адрес, который означает, что ни один сетевой интерфейс не должен использоваться. Это поле используется классом Socket, чтобы указать серверу не ожидать активности клиента.

IPAddress.Loopback

Возвращает предопределенный адрес обратной связи 127.0.0.1. Этот адрес используется не для соединения с сетью, а для локальных операций на одной машине.

IPAddress.Broadcast

Возвращает широковещательный IP-адрес. В широковещательных сообщениях можно посылать данные всем компьютерам в локальной сети.

IPAddress.Any

У компьютера может быть несколько сетевых плат с несколькими IP-адресами. Сокет использует IPAddress.Any, чтобы ожидать действия на любом из этих сетевых интерфейсов.

Класс IPHostEntry

Класс IPHostEntry инкапсулирует информацию об определенном компьютере-хосте. Этот класс делает имя хоста доступным через свойство HostName (которое возвращает строку), а свойство AddressList возвращает массив объектов IPAddress.

Класс Dns

Класс Dns способен взаимодействовать с DNS-сервером по умолчанию для извлечения IP-адреса. Он имеет два важных статических метода — GetHostEntry(), который использует DNS-сервер для получения деталей хоста по заданному его имени, и GetHostByAddress(), который также возвращает детали хоста, но на этот раз используя IP-адрес. Оба метода возвращают объект IPHostEntry.

Класс Dns отличается от классов IPAddress и IPHostEntry тем, что обладает способностью действительно взаимодействовать с серверами для получения информации. В отличие от него IPAddress и IPHostEntry — это скорее просто структуры данных с удобными свойствами, обеспечивающими доступ к лежащим в основе данным.

Давайте рассмотрим пример WPF-приложения, использующего возможности класса Dns:

public MainWindow()
{
            InitializeComponent();

            string hostname = "www.google.com", message = "IP адреса для домена " + hostname + "\n";
            IPHostEntry entry = Dns.GetHostEntry(hostname);

            foreach (IPAddress a in entry.AddressList)
                message += "  --> "+ a.ToString() + "\n";

            message += "\nАльтернативное имя домена: ";
            foreach (string aliasName in entry.Aliases)
                message += aliasName + "\n";

            message += "\nРеальное название хоста: " + entry.HostName;
            MessageBox.Show(message);
}
Использование класса DNS
Пройди тесты
Лучший чат для C# программистов