Чтобы отправить сообщение определенному устройству в сети, это устройство должно иметь уникальный адрес. В качестве уникального адреса выступает 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.
Еще один и более удобный способ представляет метод 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
Схема адресации может потребоваться при создании сокетов для построения коммуникации по сети.
Каждое сетевое приложение, которое прослушивает входящие запросы, запускается на определенном порту. Одномоментно один порт может прослушиваться только одним приложением. Порт представляет 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