Адреса в .NET

Последнее обновление: 23.10.2022

IPAddress

Чтобы отправить сообщение определенному устройству в сети, это устройство должно иметь уникальный адрес. В качестве уникального адреса выступает IP-адрес. Существует несколько различных протоколов адресов. В настоящее время наиболее распространен протокол IPv4, который предполагает представление адреса в виде 32-битного числа, например, 37.120.16.63. Такой адрес содержит четыре числа, разделенных точками, и каждое число находится в диапазоне от 0 до 255. Однако также в последнее время набирает оборот использование адресов протокола IPv6, которые представляют собой 128-битное значение, например, 2001:0db8:85a3:0000:0000:8a2e:0370:7334 (формат IPv6)..

В системе классов .NET ip-адрес представлен классом IPAddress из пространства System.Net. Для определения ip-адреса можно применять ряд конструкторов этого класса. Некоторые из них:

public IPAddress (byte[] address);
public IPAddress (long newAddress);

Первый конструктор принимает определения адреса в виде массива байт, а второй - в виде значения long от 0 до 0x00000000FFFFFFFF. Применение:

using System.Net;

IPAddress localIp = new IPAddress(new byte[] { 127, 0, 0, 1 });
Console.WriteLine(localIp); // 127.0.0.1

IPAddress someIp = new IPAddress(0x0100007F);
Console.WriteLine(someIp); // 127.0.0.1

При использовании значения long применяется big-endian -формат, то есть, грубо говоря, значения адреса определяются с конца. Например, значение 0x0100007F означает, что "7F" (127 в десятичной системе) определяет первый сегмент адреса, 00 и 00 - второй и третий сегменты, и 01 - четвертый. Таким образом, получаем из "0x0100007F" адрес 127.0.0.1.

IPAddress.Parse и IPAddress.TryParse

Еще один и более удобный способ представляет метод Parse(), который представляет адрес в формате IPv4 или IPv6 в виде строки и возвращает объект IPAddress:

IPAddress ip = IPAddress.Parse("127.0.0.1");

Однако строка может содержать ошибки, и вполне возможно, что конвертация в IPAddress пройдет неудачно. В этом случае возникнет исключение. Чтобы этого избежать, мы можем использовать метод TryParse():

using System.Net;

IPAddress.TryParse("127.0.0.1rrr", out IPAddress? ip);
Console.WriteLine(ip?.ToString());

Если конвертация прошла неудачно, то IPAddress.TryParse() возвратит false, а выходной out-параметр будет иметь значение null.

Встроенные адреса

Также класс IPAddress предоставляет ряд адресов по умолчанию через ряд статических свойств:

  • Статическое свойство Loopback: возвращает объект IPAddress для адреса 127.0.0.1

  • Статическое свойство Any: возвращает объект IPAddress для адреса 0.0.0.0

  • Статическое свойство Broadcast: возвращает объект IPAddress для адреса 255.255.255.255

IPAddress anyIp = IPAddress.Any;
IPAddress localIp = IPAddress.Loopback;
IPAddress broadcastIp = IPAddress.Broadcast;

Схема адресации

Среди свойств IPAddress следует отметить свойство AddressFamily, которое указывает на схему адресации. Это свойство представляет перечисление AddressFamily, которое может принимать следующие значения:

  • AppleTalk: адрес AppleTalk

  • Atm: адрес собственных служб ATM

  • Banyan: адрес Banyan

  • Ccitt: адреса протоколов CCITT, таких как протокол X25

  • Chaos: адрес протоколов MIT CHAOS

  • Cluster: адрес кластерных продуктов корпорации Майкрософт

  • ControllerAreaNetwork: сетевой адрес области контроллера

  • DataKit: адрес протоколов Datakit

  • DataLink: адрес интерфейса прямого канала передачи данных

  • DecNet: адрес DECnet

  • Ecma: адрес ЕСМА (European Computer Manufacturers Association — европейская ассоциация производителей компьютеров)

  • FireFox: адрес FireFox

  • HyperChannel: адрес NSC Hyperchannel

  • Ieee12844: адрес рабочей группы IEEE 12844

  • ImpLink: адрес ARPANET IMP

  • InterNetwork: IPv4-адрес

  • InterNetworkV6: IPv6-адрес

  • Ipx: IPX- или SPX-адрес

  • Irda: IrDA-адрес

  • Iso: адрес протоколов ISO

  • Lat: LAT-адрес

  • Max: MAX-адрес

  • NetBios: адрес NetBios

  • NetworkDesigners: адрес шлюзовых протоколов Network Designers OSI

  • NS: адрес протоколов Xerox NS

  • Osi: адрес протоколов OSI

  • Packet: адрес пакета нижнего уровня

  • Pup: адрес протоколов PUP

  • Sna: адрес IBM SNA

  • Unix: локальный адрес Unix для узла

  • Unknown: семейство неизвестных адресов

  • Unspecified: семейство неуказанных адресов

  • VoiceView: адрес VoiceView

Например:

using System.Net;

IPAddress localIp = new IPAddress(new byte[] { 127, 0, 0, 1 });
Console.WriteLine(localIp.AddressFamily); // InterNetwork

Схема адресации может потребоваться при создании сокетов для построения коммуникации по сети.

Конечная точка IPEndpoint

Каждое сетевое приложение, которое прослушивает входящие запросы, запускается на определенном порту. Одномоментно один порт может прослушиваться только одним приложением. Порт представляет 2-х байтное значение от 0 до 65535. Соответственно возникает необходимость разграничить адреса различных приложений, которые расположены по одному и тому же адресу. Для этого применяются конечные точки.

Конечная точка представляет объединение IP-адреса и порта и в .NET представляет класс IPEndPoint из пространства имен System.Net. В дальнейшем конечные точки потребуются для определения сокетов.

Для создания конечной точки может применяться один из конструкторов класса:

public IPEndPoint (long address, int port);
public IPEndPoint (IPAddress address, int port);

В первом случае для установки ip-адреса применяется значение long, а во втором случае - объект IPAddress. Второй параметр во всех случаях представляет порт. Пример создания:

using System.Net;

IPAddress ip = IPAddress.Parse("127.0.0.1");
IPEndPoint endpoint = new IPEndPoint(ip, 8080);
Console.WriteLine(endpoint);        // 127.0.0.1:8080

В данном случае ip-адрес 127.0.0.1, а порт - 8080.

Также мы можем использовать методы Parse()/ TryParse(), которые получают строку в формате "адрес:порт" и создают по ней конечную точку:

IPEndPoint endPoint1 = IPEndPoint.Parse("127.0.0.1:8080");
IPEndPoint.TryParse("127.0.0.1:8080", out IPEndPoint? endPoint2);

Свойства IPEndPoint предоставляют доступ к информации о конечной точке:

  • Address: возвращает или устанавливает IP-адрес

  • AddressFamily: возвращает схему адресации, которую применяет IP-адрес

  • Port: возвращает или устанавливает номер порта

IPEndPoint endpoint = IPEndPoint.Parse("127.0.0.1:8080");
Console.WriteLine(endpoint.Address);    // 127.0.0.1
Console.WriteLine(endpoint.Port);    // 8080
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850