Использование протоколов IPX, SPX, NETBIOS

       

Диагностический сервис IPX


Программа может посылать диагностические запросы либо конкретной станции в сети, либо всем станциям, либо всем станциям, за исключением перечисленных в списке.

Для посылки диагностического запроса программа должна подготовить IPX-пакет, состоящий из обычного заголовка размером 30 байт и блока данных, имеющего следующую структуру:

struct _REQ { unsigned char Exclusions; unsigned char List[80][6]; };

Заголовок пакета подготавливается обычным образом. В качестве номера сети можно указывать либо действительный номер сети, либо нулевое значение.

В качестве сетевого адреса можно указывать либо адрес конкретной станции, либо адрес FFFFFFFFFFFFh. В поле сокета необходимо проставить значение 0456h.

В поле Exclusions блока данных необходимо проставить количество станций, от которых не требуется получать диагностику. Адреса таких станций должны быть перечислены в массиве List. Если вам надо получить диагностику от всех станций, укажите в поле Exclusions нулевое значение. В любом случае, если диагностика должна быть получена от нескольких станций, в качестве адреса в заголовке пакета необходимо указывать значение FFFFFFFFFFFFh.

Блок ECB для передачи диагностического запроса также подготавливается обычным образом. При первом диагностическом запросе в поле ImmAddress указывается значение FFFFFFFFFFFFh. В дальнейшем при определении конфигурации сети, подключенной через мост, в этом поле вы будете указывать сетевой адрес моста.

Важное замечание относительно сокета 0456h: вы не должны открывать или закрывать этот сокет. Диагностический сокет уже открыт, вы должны использовать его для формирования адреса при передаче диагностического запроса. Для приема ответных пакетов конфигурации (а также для передачи запроса) вам следует динамически получить от драйвера IPX другой сокет.

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

Послав диагностический пакет всем станциям, ваша программа получит несколько пакетов конфигурации, поэтому она должна заранее (перед посылкой диагностического пакета) зарезервировать достаточное количество блоков ECB и буферов для приема пакетов конфигурации.

Принятый пакет конфигурации состоит из стандартного заголовка IPX-пакета и блока данных. Принятый блок данных состоит из двух частей. Первая часть имеет фиксированную структуру, структура второй части зависит от конфигурации программного и аппаратного обеспечения станции, от которой пришел пакет конфигурации.

Приведем структуру первой части:

struct _RESPONSE { unsigned char MajorVersion; unsigned char MinorVersion; unsigned SPXDiagnosticSocket; unsigned char ComponentCount; };

В полях MajorVersion и MinorVersion находится соответственно верхний и нижний номер версии диагностического сервиса.



Поле SPXDiagnosticSocket содержит номер сокета, который должен быть использован для SPX-диагностики.

Самое интересное поле - ComponentCount. В нем находится количество компонентов программного и аппаратного обеспечения, информация о которых имеется в принятом пакете конфигурации.

Далее в принятом пакете сразу за полем ComponentCount следуют структуры, описывающие отдельные компоненты. Они могут быть двух типов - простые и расширенные. Первое поле размером в один байт имеет одинаковое значение в обоих типах структур - это идентификатор компонента. По идентификатору компонента можно однозначно судить о том, какая используется структура - простая или расширенная.

Простая структура и в самом деле несложна. Она состоит всего из одного байта идентификатора компонента:

struct _SIMPLE_COMPONENT { unsigned char ComponentID; };

Значениями поля ComponentID для простой структуры могут быть числа 0, 1, 2, 3 или 4:















Значение поля ComponentIDКомпонент
0Драйвер IPX/SPX
1Драйвер программного обеспечения моста
2Драйвер сетевой оболочки рабочей станции
3Сетевая оболочка
4Сетевая оболочка в виде VAP-процесса
<


/p> Расширенная структура сама по себе состоит из двух частей, имеющих соответственно, фиксированную и переменную структуру.

Приведем формат фиксированной части:

struct _EXTENDED_COMPONENT { unsigned char ComponentID; unsigned char NumberOfLocalNetworks; };

Поле ComponentID может содержать значения 5, 6 или 7:











Значение поля ComponentIDКомпонент
5Внешний мост
6Файл-сервер с внутренним мостом
7Невыделенный файл-сервер


Для определения конфигурации сети важно исследовать компоненты с типом 5, 6 и 7, так как именно они имеют отношение к соединениям сетей через мосты.

Переменная часть описывает сети, подключенные к компонентам с типом 5, 6 или 7. Количество таких сетей находится в поле NumberOfLocalNetworks фиксированной части.

Для описания сетей используется массив структур (размерностью NumberOfLocalNetworks):

struct _NETWORK_COMPONENT { unsigned char NetworkType; unsigned char NetworkAddress[4]; unsigned char NodeAddress[6]; };

Поле NetworkType описывает тип сети:











Содержимое поля NetworkType Тип сети
0Сеть, к которой подключен сетевой адаптер
1Сеть с виртуальным сетевым адаптером (невыделенный файл-сервер)
2Переназначенная удаленная линия (связь сетей через модемы)


Поле NetworkAddress содержит номер сети, к которой подключен соответствующий адаптер, а поле NodeAddress - сетевой адрес адаптера. Именно эти поля вам и нужны для определения номеров сетей, подключенных к мостам, и сетевых адресов самих мостов.


Содержание раздела