Рассмотрим, как получить сетевую информацию, опрашивая базу данных WMI с помощью классов библиотеки .NET Framework, обитающих в пространстве имен System.Management.
public static void Main()
{
Console.WriteLine("\tNetwork Info\n");
ManagementObjectSearcher searcher = new ManagementObjectSearcher(
"SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = 'TRUE'");
foreach (ManagementObject mo in searcher.Get())
{
Console.WriteLine(
"\nDNSHostName :\t {0}\nNetwork Card:\t {1}" +
"\nMAC Address :\t {2}\nDHCPServer :\t {3}",
mo["DNSHostName"], mo["Description"], mo["MACAddress"], mo["DHCPServer"]);
foreach (string addr in (string[])mo["IPAddress"])
Console.WriteLine("IP Address :\t {0}", addr);
foreach (string subnet in (string[])mo["IPSubnet"])
Console.WriteLine("Subnet Mask :\t {0}", subnet);
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 (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);
}
Не секрет, что многие особенности сетевого программирования были заимствованы из мира Unix. Программирование сетевых разъемов (socket programming) является одной из них. Разработчики операционной системы Unix внесли много нового в такие фундаментальные концепции, как файл и поток данных. Одним из самых важных, новых понятий в системе Unix является концепция файлового дескриптора. Он обеспечивает стандарт общения (интерфейс) с таким объектом, как файл. Важно то, что в системе Unix почти все объекты считаются файлами, устройства—тоже. Поэтому файловый дескриптор можно с успехом использовать для обмена данными между сетевыми устройствами. Удобно то, что при этом работает одна и та же программная модель. Сетевой файловый дескриптор в Unix называется разъемом (socket).
Теперь и Windows использует понятие сетевого разъема для реализации модели программирования Windows Sockets. Сейчас она обозначается, как Windows Sockets 2, или Winsock. Функции API, поддерживающие эту модель, являются основой для тех классов, которые сосредоточены в пространстве имен System.Net.Sockets. Перед тем, как начать работу с классами .NET, полезно рассмотреть каркас обычного Windows API-приложения, работающего с сетевым разъемом. Чтобы представить себе стиль программирования, принятый в этой области, а также используемые в ней технологические приемы и решения, просмотрите макроподстановку.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.