Локальные сети персональных компьютеров. Работа с сервером Novell NetWare

       

Программа WKSTABLE


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

Программа WKSTABLE (листинг 8) получает адреса всех таблиц и выводит их в стандартный поток вывода в соответствующем формате. Вы можете подключиться к нескольким серверам и выполнить отображение дисков утилитами attach.exe и map.exe из каталога SYS:PUBLIC, а затем запустить программу и посмотреть содержимое таблиц.

// ============================================================ // Листинг 8. Отображение содержимого таблиц сетевой оболочки. // Файл wkstable\wkstable.cpp // // (C) A. Frolov, 1993 // ============================================================

#include <stdlib.h> #include <stdio.h> #include <dos.h> #include <conio.h>

#define BYTE unsigned char

// Формат таблицы номеров каналов для сетевой оболочки

struct ConnectionIDTable { BYTE InUseFlag; BYTE OrderNumber; BYTE NetworkNumber[4]; BYTE NodeAddress[6]; BYTE SocketNumber[2]; BYTE ReceiveTimeout[2]; BYTE RoutingNode[6]; BYTE PacketSequenceNumber; BYTE ConnectionNumber; BYTE ConnectionStatus; BYTE MaximumTimeout[2]; BYTE Reserved[5]; }; void GetTableAddress(int Table, char far * *TableAddress); void ShowTable(char far *DriveHandleTable); void ShowConnIDTable(struct ConnectionIDTable far *ConnIDTable); void ShowServerNameTable(char far *ServerNameTable);

void main(void) {

// Указатели на таблицы сетевой оболочки

char far *DriveHandleTable; char far *DriveFlagTable; char far *DriveServerTable; char far *ServerMappingTable; char far *ServerNameTable;

struct ConnectionIDTable far *ConnIDTable;

// Получаем указатели на таблицы

GetTableAddress(0, &DriveHandleTable); GetTableAddress(1, &DriveFlagTable); GetTableAddress(2, &DriveServerTable); GetTableAddress(3, &ServerMappingTable); GetTableAddress(4, &ServerNameTable);




printf("\nТаблицы сетевой оболочки, (C) Frolov A., 1993\n" "---------------------------------------------\n");

// Отображаем содержимое таблицы индексов дисковых устройств

printf("\nDrive Handle Table (%Fp)\n", DriveHandleTable); printf( "------------------\n"); ShowTable(DriveHandleTable);

// Отображаем содержимое таблицы флагов дисковых устройств

printf("\nDrive Flag Table (%Fp)\n", DriveFlagTable); printf( "----------------\n"); ShowTable(DriveFlagTable);

// Отображаем содержимое таблицы отображения дисков на серверы

printf("\nDrive Server Table (%Fp)\n", DriveServerTable); printf( "------------------\n"); ShowTable(DriveServerTable);

printf("Нажмите любую клавишу для продолжения...\n"); getch();

// Отображаем содержимое таблицы каналов с серверами

ConnIDTable = (struct ConnectionIDTable far *)ServerMappingTable;

printf("\nConnection ID Table (%Fp)\n", ConnIDTable); printf( "-------------------\n"); ShowConnIDTable(ConnIDTable);

// Отображаем содержимое таблицы имен серверов

printf("\nServer Name Table (%Fp)\n", ServerNameTable); printf( "-----------------\n"); ShowServerNameTable(ServerNameTable); }

// =========================================================== // Функция для отображения таблицы имен серверов // ===========================================================

void ShowServerNameTable(char far *ServerNameTable) { for(int i=0; i<8; i++) { if(*(ServerNameTable + 48*i) != '\0') printf("%d: %Fs\n", i+1, ServerNameTable + 48*i); else printf("%d: Не используется\n", i+1); } }

// =========================================================== // Функция для отображения таблицы каналов рабочей станции // ===========================================================

void ShowConnIDTable(struct ConnectionIDTable far *ConnIDTable) {

printf("Порядковый номер:\t"); for(int i=0; i<8; i++) { printf("%d ", i+1); } printf("\nНомер канала:\t\t"); for(i=0; i<8; i++) { printf("%02.2X ", (ConnIDTable + i)->ConnectionNumber); }



printf("\nСостояние канала:\t"); for(i=0; i<8; i++) { printf("%02.2X ", (ConnIDTable + i)->ConnectionStatus); } printf("\n"); }

// =========================================================== // Функция для вывода содержимого таблиц отображения // дисковых устройств // ===========================================================

void ShowTable(char far *Table) {

printf("A B C D E F G H I J K L M N " "O P Q R S T U V W X Y Z\n"); for(int i=0; i<26; i++) { printf("%02.2X ",(unsigned char)*(Table +i)); } printf("\n[ \\ ] ^ _ '\n"); for(i=26; i<32; i++) { printf("%02.2X ",(unsigned char)*(Table +i)); } printf("\n"); } // =========================================================== // Функция для получения указателей на таблицы // оболочки рабочей станции // ===========================================================

void GetTableAddress(int Table, char far* *TableAddress) {

union REGS regs; struct SREGS sregs;

regs.h.ah = 0xef; regs.h.al = Table; intdosx(&regs, &regs, &sregs); FP_OFF(*TableAddress) = regs.x.si; FP_SEG(*TableAddress) = sregs.es; }

Мы запустили программу в сети, содержащей четыре файл-сервера, и вот что увидели на экране:

Таблицы сетевой оболочки, (C) Frolov A., 1993 ---------------------------------------------

Drive Handle Table (C143:01A0) ------------------ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 00 00 00 00 00 00 00 00 00 02 00 00 00 00 00 00 00 00 02 02 02 00 06 03 04 05 [ \ ] ^ _ ' 00 00 00 00 00 00

Drive Flag Table (C143:01C0) ---------------- A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 80 80 80 80 80 80 80 80 80 01 00 00 00 00 00 00 00 00 01 01 01 00 01 01 01 01 [ \ ] ^ _ ' 00 00 00 00 00 00

Drive Server Table (C143:01E0) ------------------ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 04 03 02 00 01 01 01 01 [ \ ] ^ _ ' 00 00 00 00 00 00 Нажмите любую клавишу для продолжения...



Connection ID Table (C143:0254) ------------------- Порядковый номер: 1 2 3 4 5 6 7 8 Номер канала: 04 0B 01 01 FF FF FF FF Состояние канала: FF FF FF FF 00 00 00 00

Server Name Table (C143:0354) ----------------- 1: SYSPRG 2: SMARTNET 3: NETLAB 4: WINLAB 5: Не используется 6: Не используется 7: Не используется 8: Не используется

Из таблицы Server Name Table видно, что рабочая станция создала каналы с серверами SYSPRG, SMARTNET, NETLAB и WINLAB.

Анализируя содержимое таблицы Drive Flag Table, можно сделать вывод, что рабочая станция имеет локальные диски от A: до I:, диски J:, S:, T:, U:, W:, X:, Y:, Z: постоянно отображены на сетевые каталоги, т. е. это сетевые диски.

Из таблицы Drive Server Table видно, что диски J:, W:, X:, Y:, Z: отображены на каталоги сервера SYSPRG (номер канала соответствует позиции имени файл-сервера в таблице имен). Диск U: отображен на сервер SMARTNET (канал 2), диск T: - на сервер NETLAB (канал 3), диск S: - на сервер WINLAB (канал 4).

Таблица Drive Handle Table позволяет сетевой оболочке определить, на какие конкретно каталоги отображены соответствующие диски, так как она содержит индекс таблицы отображения соответствующего файл-сервера.

Из таблицы Connection ID Table можно получить информацию о том, какие из 8 имеющихся каналов задействованы и какие номера каналов используют серверы для работы с нашей станцией. Например, сервер SYSPRG использует канал с номером 04h, сервер SMARTNET - канал с номером 0Bh, а серверы NETLAB и WINLAB - каналы с номером 01h. Пусть вас не смущает, что последние два сервера используют один и тот же номер канала: эти номера соответствуют таблице, расположенной в сервере, а не в рабочей станции.


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