Сетевое программирование в .NET, страница 19

  IPEndPoint point = new IPEndPoint(addr, 80);

  Console.WriteLine("\n{0,-20}: {1}\n{2,-20}: {3}\n{4,-20}: {5}",

    "Local IP address", addr,

    "Address Family", addr.AddressFamily,

    "IP End Point", point);

  Console.Write("Address Bytes       : ");

  foreach (byte b in addr.GetAddressBytes())

    Console.Write(b + " | ");

  Console.Write("\n\nLoopback address is ");

  if (addr.Equals(IPAddress.Loopback))

    Console.WriteLine("the same as local address\n");

  else

    Console.WriteLine("different from local address\n");

  if (addr.AddressFamily.ToString() == ProtocolFamily.InterNetworkV6.ToString())

    Console.WriteLine("Scope Id: " + addr.ScopeId);

}

if (IPAddress.IsLoopback(IPAddress.Loopback))

  Console.WriteLine("{0,-20}: {1}", "Loopback address", IPAddress.Loopback);

else

  Console.WriteLine("Error obtaining the loopback address");

short nw = (short)0x1234;

Console.WriteLine("\nTest Byte Order" + line.Substring(0, 16) +

  "\n\n{0,-20}: {1:x}\n{2,-20}: {3:x}\n{4,-20}: {5:x}\n",

  "Network Byte order", nw,

  "Host Byte order", IPAddress.NetworkToHostOrder(nw),

  "Back to Network", IPAddress.HostToNetworkOrder(IPAddress.NetworkToHostOrder(nw)));

IPAddress a;

if (IPAddress.TryParse("127.0.0.1", out a))

  Console.WriteLine("\nTest TryParse" + line.Substring(0, 14) +  "\n{0,-20}: {1}\n",

    "Valid IP-address", a);

¨  Класс IPHostEntry ассоциирует DNS-имя (Domain Name System) хост-компьютера с массивом его альтернативных имен (aliases—псевдонимов) и массивом соответствующих им IP-адресов.

¨  Метод NetworkToHostOrder класса IPAddress выполняет ту же роль, что и функция htons в предыдущем примере—меняет порядок байтов (big-endian, little-endian).

¨  Класс IPEndPoint инкапсулирует функциональность пары (сетевой адрес, порт), он содержит те же данные, что и структура sockaddr_in в предыдущем примере.

Internet Control Message Protocol (ICMP)—это множество сообщений, используемых для получения отчетов об ошибках передачи пакетов информации. Существует два типа таких протоколов: версии 4 (IPv4) и версии 6 (IPv6). Свойство AddressFamily класса IPAddress позволяет определить используемый сервером тип протокола. Если он соответствует версии 4 (IPv4), то этому свойству соответствует строка текста: InterNetwork, если включена поддержка версии 6 (IPv6), то строка имеет вид: InterNetworkV6.

При выводе сетевого адреса автоматически срабатывает метод ToString(), который выбирает один из стандартных форматов. Если в системе установлен протокол IPv4, то сетевой адрес получает свой формат (четверка чисел, разделяемых точкой—dotted-quad notation), если установлен протокол IPv6, то используется другой формат (шестнадцатиричные числа, разделяемые двоеточием).

Свойства адаптеров

Мы уже говорили, что под сетевым интерфейсом понимают сетевой адаптер—устройство, которое подключает компьютер к сети и определяет способы передачи данных между узлами сети. Класс NetworkInterface инкапсулирует данные о сетевых интерфейсах локального компьютера. Для получения информации вам не надо создавать объект класса NetworkInterface, просто воспользуйтесь его статическим методом GetAllNetworkInterfaces и получите массив ссылок на объекты класса NetworkInterface, каждый из которых содержит информацию о конкретном сетевом адаптере компьютера. Логика этого приема должна быть вам знакома.

foreach (NetworkInterface adapter in NetworkInterface.GetAllNetworkInterfaces())

{

  // Работаем с объектом adapter

}

Каждый объект (adapter) содержит информацию о конфигурации сетевого интерфейса и статистику его использования. Рассмотрим, как отобразить эту информацию. Для того, чтобы увидеть самые простые свойства используемых адаптеров, добавьте в конец метода Main такой фрагмент.

Console.WriteLine("\nTest Adapters" + line.Substring(0, 14) + "\n\n");