Сетевое программирование в .NET. Расшифровка IP-адреса (IP address specification). Обеспечение надежности доставки пакетов, страница 10

В таблице всегда есть строка с именем Default. Ее любят использовать программы на VB6 для доступа к COM-объектам. Клиентские программы на C++ обычно пользуются именованными данными. Default-значения в среде разработки VB6 срабатывают по двойному щелчку, реализуя сценарий: "Я не знаю что это такое, но, все равно, работай" и это похоже на чудо, так как объект сам показывает (или рассказывает), что он имеет и/или умеет.

Для того, чтобы найти в сундуке интересующие нас данные, придется основательно порыться. Начните с адреса:

HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkCards

Здесь вы видите свои сетевые карты (их может быть несколько). Среди значений одного из ключей (соответствующего выбранной вами карте) найдите значение с именем ServiceName. Оно отправляет нас к сервису, который работает с картой. Его надо искать в другой ветви реестра, которая соответствует имени сервиса. Например:

HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\имя сервиса

Если карта встроена в материнскую плату (мой случай), то алгоритм поиска другой. Сначала найдите ключ:

HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Adapters\

Найденный ключ может иметь несколько ветвей, некоторые из них представляют собой 128-битовые, уникальные идентификаторы сетевых адаптеров. Далее надо искать номера этих адаптеров в ветви реестра:

HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\номер адаптера

Таблица значений этого ключа (если выбран активный адаптер, то есть, задействованный в данный момент), содержит интересующую нас информацию. IP-адрес вы обнаружите в виде значения с именем DhcpIPAddress, маску подсети—в виде значения с именем DhcpSubnetMask, и т. д. Чтобы слегка поворошить сундук и осознать (нет, скорее, почувствовать) связи между его жителями, просмотрите ключ:

HKLM\SYSTEM\ControlSet001\Control\Network\

В эту ветвь вложена ветвь, которая является идентификатором материнской платы. Внутрь нее вложены идентификаторы сетевых соединений. Одно из них содержит знакомый вам номер. Просмотрите адрес:

HKLM\SYSTEM\ControlSet001\Services\номер адаптера\Parameters\Tcpip

Он тоже содержит искомую информацию, но в сокращенном виде.

Программный способ получения информации из реестра

В пространстве имен Microsoft.Win32 библиотеки классов .NET Framework есть два класса позволяющие манипулировать записями реестра, это—Registry и RegistryKey. Класс Registry дает доступ к полям данных (объектам класса RegistryKey), соответствующим главным ветвям реестра: ClassesRoot, CurrentUser, LocalMachine, Users, CurrentConfig.

В реестре есть раздел PerformanceData. Он—виртуальный, попытка обратиться к нему провоцирует систему собрать информацию о производительности. Счетчики производительности (Performance Counters) и управление ими является еще одной из (сокрытых во мраке COM) технологий Microsoft. В Windows 98 и Me, кроме указанных разделов, существует раздел DynData.

Покажем, как получить сетевую информацию с помощью методов указанных классов. Метод GetSubKeyNames класса RegistryKey позволяет получить массив имен всех ключей какой-либо ветви реестра. Например, вызов: string[] names=Registry.ClassesRoot.GetSubKeyNames(); в моей системе возвращает более 7000 строк. В основном это информация об установленных COM-объектах. Следующий фрагмент показывает, как получить из реестра и вывести сетевую информацию (в случае, когда сетевая карта встроена в материнскую плату).

public static void Main()

{

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

string tcp = @"SYSTEM\CurrentControlSet\Services\Tcpip\Parameters";

RegistryKey adapterKey = Registry.LocalMachine.OpenSubKey (tcp + @"\Adapters\");

if (adapterKey == null)

{

Console.WriteLine("Bad registry key"); return;

}

foreach (string adapter in adapterKey.GetSubKeyNames())

{

RegistryKey key = Registry.LocalMachine.OpenSubKey (tcp + @"\Interfaces\" + adapter);

if (key != null)

{