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

foreach (NetworkInterface adapter in NetworkInterface.GetAllNetworkInterfaces())

{

  IPInterfaceProperties ip = adapter.GetIPProperties();

  string name = adapter.Description;

  Console.WriteLine (name + line.Substring(0, name.Length + 1) +

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

    "  DNS suffix", ip.DnsSuffix,

    "  DNS enabled", ip.IsDnsEnabled,

    "  Dynamically configured", ip.IsDynamicDnsEnabled);

}

Для каждого из протоколов есть класс, содержащий общие сведения о конфигурации адаптера. Например, класс IPv4InterfaceProperties содержит такие свойства:

¨  IsAutomaticPrivateAddressingActive указывает, поддерживается-ли автоматическое присвоение адресов (Automatic Private IP addressing—APIPA). Эта настройка позволяет автоматически получить адрес (в диапазоне от 169.254.0.0 до 169.254.255.255) для тех компьютеров, которые не имеют доступа к службе DHCP (Dynamic Host Configuration Protocol).

¨  Mtu (Maximum Transmission Unit) сетевого интерфейса—это максимальный размер пакета, который может быть передан с его помощью. Его принято измерять в октетах (синоним байтам), для TCP/IP он равен 1500.

¨  Свойство IsForwardingEnabled показывает, может-ли интерфейс изменять маршрут (route) пакетов.

¨  Свойство UsesWins показывает, используется-ли служба WINS, работающая с распределенной базой данных регистрации и опроса динамических NetBIOS-имен, отображаемых в IPv4-адреса.

Рассмотрим, как использовать класс IPv4InterfaceProperties для вывода указанных свойств. Вставьте внутрь цикла прохода по всем адаптерам (в конец тела цикла foreach) следующий фрагмент кода.

  if (!adapter.Supports(NetworkInterfaceComponent.IPv4))

    break;

  IPv4InterfaceProperties ip4 = ip.GetIPv4Properties();

  if (ip4 == null)

  {

    Console.WriteLine("No IPv4 information is available for this interface");

    break;

  }

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

    "{6,-28}: {7}\n{8,-28}: {9}\n{10,-28}: {11}\n",

    "  Index", ip4.Index, "  MTU", ip4.Mtu,

    "  APIPA active", ip4.IsAutomaticPrivateAddressingActive,

    "  APIPA enabled", ip4.IsAutomaticPrivateAddressingEnabled,

    "  Forwarding enabled", ip4.IsForwardingEnabled,

    "  Uses WINS", ip4.UsesWins);

Вывод статистики

Следует различать два типа статистической информации. Для каждого из двух протоколов (IPv4 и IPv6) можно получить глобальную статистику IP-соединения, поддерживаемую классом IPGlobalStatistics и детальную статистику локального компьютера, поддерживаемую классами IcmpV4Statistics и IcmpV6Statistics. В первом случае надо использовать методы: GetIPv4GlobalStatistics и GetIPv6GlobalStatistics класса IPGlobalStatistics, во втором—множество свойств двух Icmp*-классов.

Выводимые результаты сильно зависят от того, в какой системе действует испытуемый компьютер. В системе со сложной конфигурацией на экран будет выведено довольно много данных. Если так, то стоит подумать о частичном выводе данных или разработке Windows-приложения, в котором информация будет отражаться в нескольких списках (элементах типа ListView).

Теперь добавим вывод реальной статистики, полученной с помощью объекта класса IPGlobalStatistics и его метода GetIPv4GlobalStatistics. Информация проходит через адаптер в двух направлениях, некоторые пакеты фрагментированы и нуждаются в процедуре восстановления (Reassembly), поэтому все статистические данные разделены на 4 группы (общие данные, данные о входящих пакетах, выходящих и фрагментированных пакетах).

Следующий код надо вставить в конец цикла прохода по адаптерам и использовать совместно с кодом, прозванивающим сервер, иначе (если нет подключения к Internet) статистика, может оказаться нулевой. Здесь используется ссылка p на объект класса IPGlobalProperties, которая была получена ранее.

IPGlobalStatistics st = p.GetIPv4GlobalStatistics();