Классы .NET для IP-адресов
194C# и .NET --- Сетевое программирование --- Классы .NET для IP-адресов
В Интернете серверы и клиенты идентифицируются по 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);
}