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

    string[] gates = (string[])mo["DefaultIPGateway"];

    if (gates != null)

      foreach (string gate in (string[])mo["DefaultIPGateway"])

        Console.WriteLine("Gateway     :\t {0}", gate);

  }

  Console.WriteLine("\n\n");

}

В моей системе эта программа производит такой вывод:

DNSHostName :    alex

Network Card:    NVIDIA nForce Networking Controller

MAC Address :    00:11:D8:28:2C:78

DHCPServer  :    255.255.255.255

IP Address  :    169.254.13.32

Subnet Mask :    255.255.0.0

С помощью класса библиотеки .NET Framework по имени ManagementObjectSearcher был определен SQL-запрос. Метод Get использует этот запрос для выбора из базы WMI коллекции (ManagementObjectCollection) объектов типа ManagementObject. Каждый такой объект представляет собой одну запись возвращаемой таблицы (Record Set). Флаг IPEnabled позволяет отфильтровать только те сетевые устройства, которые были сконфигурированы и проигнорировать все остальные.

Используем DNS

Рассмотрим еще один способ получения сетевой информации, который использует классы библиотеки, управляющие подсистемой DNS (Domain Name System). Они расположены в пространстве имен System.Net. Класс Dns имеет ряд статических методов, которые позволяют как в синхронном, так и в асинхронном режиме получить ссылку на объект класса IPHostEntry. Последний является контейнером, содержащим информацию об узле сети (компьютере). В этом контейнере мы можем выбрать массив IP-адресов, приписанных Internet-узлу, как показано в следующем фрагменте.

public static void Main()

{

  string hostName = Dns.GetHostName();

  Console.WriteLine("Local hostname: {0}", hostName);

  IPHostEntry host = Dns.GetHostEntry (hostName);

  foreach (IPAddress addr in host.AddressList)

    Console.WriteLine ("IP Address    : " + addr);

}

Реализация сетевого разъема в рамках Winsock

Не секрет, что многие особенности сетевого программирования были заимствованы из мира Unix. Программирование сетевых разъемов (socket programming) является одной из них. Разработчики операционной системы Unix внесли много нового в такие фундаментальные концепции, как файл и поток данных. Одним из самых важных, новых понятий в системе Unix является концепция файлового дескриптора. Он обеспечивает стандарт общения (интерфейс) с таким объектом, как файл. Важно то, что в системе Unix почти все объекты считаются файлами, устройства—тоже. Поэтому файловый дескриптор можно с успехом использовать для обмена данными между сетевыми устройствами. Удобно то, что при этом работает одна и та же программная модель. Сетевой файловый дескриптор в Unix называется разъемом (socket).

Теперь и Windows использует понятие сетевого разъема для реализации модели программирования Windows Sockets. Сейчас она обозначается, как Windows Sockets 2, или Winsock. Функции API, поддерживающие эту модель, являются основой для тех классов, которые сосредоточены в пространстве имен System.Net.Sockets. Перед тем, как начать работу с классами .NET, полезно рассмотреть каркас обычного Windows API-приложения, работающего с сетевым разъемом. Чтобы представить себе стиль программирования, принятый в этой области, а также используемые в ней технологические приемы и решения, просмотрите макроподстановку.

#define FD_CLR(fd, set) do { \

    u_int __i; \

    for (__i = 0; __i < ((fd_set FAR *)(set))->fd_count ; __i++) { \

        if (((fd_set FAR *)(set))->fd_array[__i] == fd) { \

            while (__i < ((fd_set FAR *)(set))->fd_count-1) { \

                ((fd_set FAR *)(set))->fd_array[__i] = \

                    ((fd_set FAR *)(set))->fd_array[__i+1]; \

                __i++; \

            } \

            ((fd_set FAR *)(set))->fd_count--; \

            break; \

        } \

    } \

} while(0)

Я привел ее не для того, чтобы вы вникали в алгоритм манипулирования структурой fd_set (этот тип инкапсулирует массив переменных типа SOCKET), а для того, чтобы вы сравнили мир, в котором жила команда программистов, разрабатывавшая семейство API Winsock, тип их мышления, с тем, что предлагает подход к разработке ПО, основанный на платформе .NET. Полезно также вспомнить, что думает о макроподстановках Bjarne Stroustrup.