Информационный сервер для программистов: Исходники со всего света. Паскальные исходники со всего света
  Powered by Поисковый сервер Яndex: Найдется ВСЁ!
На Главную Pascal Форум Информер Страны мира
   Локальные сети    >>    IPXLib
   
 

Модуль IPX для NOVELL-NETWARE

Руководство пользователя




Школа инженеров, Берн HTL

Дипломная работа, 1991

Rene Gilomen

(перевод и оформление: Valery Votintsev)


Оглавление

1. Введение

2. Novell-NetWare

3. Особенности библиотеки

4. Структуры данных

5. Описание функций
IPX_Setup
IPX_Open_Socket
IPX_Close_Socket
IPX_Send
IPX_Receive
IPX_Done
IPX_Internetwork_Address
IPX_To_Addr
IPX_From_Addr

6. Ограничения и проблемы

Литература


1. Введение

В настоящей работе описывается библиотека функций для TURBO PASCAL, позволяющая осуществлять передачу и прием данных по локальной сети на базе Novell Netware с использованием протокола IPX.

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

Для работы с библиотекой достаточно простого вызова в программе необходимых функций, однако желательно, чтобы пользователь имел общее представление об операционной системе, языке программирования TURBO PASCAL, а также об аппаратном и программном обеспечении Ethernet сетей.
Основные сведения от сети приведены ниже.

2. Novell-NetWare
NOVELL-NETWARE [1] является очень распространенной сетевой операционной системой, базирующейся на Xerox Network System (XNS) [2].
Причиной широкой распространенности NETWARE является большое количество различных модификаций, которые доступны даже для небольших организаций. Например, доступны системы от Entry Level (ELS) I и II (специально для малых сетей - от 4 до 8 пользователей) до NETWARE 386 версий 3.x, поддерживающие до 250 пользователей.
Кроме того, существуют специальные программные пакеты, позволяющие использовать в качестве сервера машины типа DEC-VAX.

Компоненты сети NETWARE могут быть представлены в виде так называемой OSI-модели [Рис. 1].
На "Физическом" уровне и "Уровне данных" используются протоколы NOVELL-NETWARE Ethernet, IEEE 802.3, IEEE 802.5, ARCNET и ряд других.
На "Сетевом" и "Транспортном" уровнях используются протоколы Internetwork Packet Exchange (IPX) и Sequenced Packet Exchange (SPX).
На "Уровне Сессий" реализована базовая система сетевого ввода-вывода (Network Basic Input Output System - NETBIOS).
На уровне "Представлений" и "Приложений" представлены протоколы NETWARE Core Protocols (NCP), дополнительные сервисы, оболочка DOS и различные прикладные программы.


Application
Presentation
NCP / DOS-Shell Прикладные программы
Session NetBIOS  
Transport SPX  
Network IPX  
Data Link CSMA/CD  
Physical 802.3 / 802.5 Потроха NW :)

Рис. 1.


Приложения могут обращаться к сетевому окружению различными способами [Рис. 2].
На "Сетевом" уровне доступен протокол IPX, обеспечивающий коммуникацию без подтверждений между станциями в сети.
Взаимодействие на "Транспортном" уровне обеспечивает протокол SPX, поддерживающий коммуникацию с обязательным подтверждением.
NETBIOS-совместимые приложения могут обращаться непосредственно к уровню "Сессий".

"Workstation Shell" - это ДОС-совместимое сетевое окружение рабочей станции,
допускающее коммуникацию только между рабочей станцией и сервером.
Без дополнительного программного обеспечения непосредственная связь между двумя Workstation Shell невозможна.


Workstation
Shell
      Application
NetBIOS
Emulator
    Session
SPX   Transport
IPX       Network
Рис. 2.



Описываемый здесь "Модуль IPX для NOVELL-NETWARE" обеспечивает пользователю возможность обмена данными между рабочими станциями в сети Ethernet IEEE 802.3, и предоставляет для этого все необходимые функции на языке TURBO-PASCAL. Эти функции являются интерфейсом к "Сетевому" уровню NOVELL-NETWARE за счет реализации протокола IPX.

IPX является протоколом, не требующим подключения, т.е. если одна из рабочих станций должна взаимодействовать с другой станцией, то для этого не требуется никакой дополнительной промежуточной станции (например, сервера).
IPX-пакеты содержат адрес получателя и отправляются непосредственно к станции-получателю. Каждый пакет является самодостаточным и не имеет никакого логического отношения к другим пакетам.

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

Преимущества протокола IPX:
  • Высокая скорость и эффективность
  • Более гибкая "маршрутизация", так как никакое дополнительное сочленение с Gegenstation не должно строиться
  • Возможность отправки данных сразу нескольким станциям (Broadcasting)

Недостатки протокола IPX:
  • Отсутствие гарантированной доставки пакетов


3. Особенности библиотеки
Библиотека предназначена для TURBO-PASCAL V6.0 [3]. (С более старыми версиями библиотека не работает.)
TURBO-PASCAL поддерживает так называемые "Модули" (UNIT) - это библиотеки, которые компилируются отдельно, и подключаются к главной программе с помощью директивы USES.
Для использования данной библиотеки добавьте в код своей программы команду
Uses IPX;.

Для нормальной работы библиотеки требуется по крайней мере два IBM PC совместимых компьютера, оборудованных сетевой Ethernet картой. Компьютеры должны быть соединены в сеть друг с другом (по протоколу IEEE 802.3).

Выделенный сервер для работы с библиотекой не требуется, так как в данном случае использутся связь типа ТОЧКА-ТОЧКА (Peer to Peer).

Кроме того, на рабочих станциях должен быть загружен IPX-драйвер.

Библиотека испытывалась для протокола IPX version 2.12.


4. Структуры данных
Для работы некоторых из приведенных ниже функций дополнительно требуется описать структуру данных типа RECORD, в которую будут заноситься передаваемые данные и их длина:
SData = RECORD
	  Data	 : Data_Packet;
	  Length : WORD;
	END;
Для формирования сетевого адреса также требуется структура типа RECORD:
Network_Address = RECORD
	  Network : S4Byte;
	  Node    : S6Byte;
	  Socket  : WORD;
	END;
Data_Packet, S4Byte и S6Byte - это пользовательские типы данных, описанные в библиотеке.
Длина данных для типа Data_Packet составляет 546 байт;
S4Byte - 4 байта; и S6Byte - соответственно 6 байт.

Обратите внимание, что значения в каждый байт номера сети и номера станции следует заносить не в символьном, а в двоичном виде, т.е. каждый байт может содержать значения от нуля до 255 ($00 - $FF).

Кроме описанных выше структур пользователю доступны следующие глобальные константы:
MAX_SOCKETS - максимальное количество используемых сокетов.

MAX_DATA_SIZE - максимальная длина передаваемых данных.

NET_LENGTH - длина номера сети (в байтах).

NODE_LENGTH - длина номера узла в сети (в байтах).


5. Описание функций
FUNCTION IPX_Setup : BYTE;

Описание:
Функция инициализирует сетевое окружение для работы с IPX.

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

ПРИМЕЧАНИЕ: Данная функция обязательно должна вызываться первой,
т.е. до обращения к остальным IPX-функциям в программе.


Возвращаемое значение:
SUCCESS
Инициализация прошла успешно.

DEVICE_SW_ERROR
Сетевой драйвер не загружен или недоступен.

Пример:
VAR State : BYTE;
:
:
State := IPX_Setup;
IF State <> SUCCESS THEN
BEGIN
  Writeln ('IPX не загружен !');
  EXIT;
END;
:
:


FUNCTION IPX_Open_Socket ( VAR Socket : WORD ) : BYTE;

Описание:
Функция открывает указанный коммуникационный сокет.

Параметры:
Socket = Номер открываемого сокета

Прием и передача пакетов всегда производятся через сокеты. Обычно номер сокета задается в шестнадцатеричной форме.
Если номер сокета задать нулевым ($0000), то функция сама занесет в параметр Socket номер следующего свободного сокета.

ПРИМЕЧАНИЕ: Некоторые номера сокетов зарезервированы для определенных сетевых задач, и пользователю запрещается их использовать для своих целей (см. документацию от Novell [1]).

Возвращаемое значение:
SUCCESS
Коммуникационный сокет открыт успешно.

PARAMETER_ERROR
Сокет с данным номером уже был открыт ранее.

DEVICE_SW_ERROR
IPX недоступен.

SOCKET_TABLE_FULL
Все доступные сокеты уже заняты.

Пример:
VAR
  State  : BYTE;
  Socket : WORD;
:
:
  IPX_Setup ....
:
:
  Socket := $8000;
:
  State := IPX_Open_Socket (Socket);
  IF State <> SUCCESS THEN
  BEGIN
    Writeln ('Socket Open Error');
    EXIT;
  END;
:
:


FUNCTION IPX_Close_Socket ( Socket : WORD ) : BYTE;

Описание:
Функция закрывает указанный коммуникационный сокет.

При закрытии сокета происходит освобождение занятой сокетом памяти.

Параметры:
Socket = Номер закрываемого сокета (обычно в 16-ричной форме)

Возвращаемое значение:
SUCCESS
Сокет закрыт успешно.

PARAMETER_ERROR
Сокета с указанным номером не существует.

Пример:
VAR
  State  : BYTE;
  Socket : WORD;
:
:
  IPX_Setup ...
:
  IPX_Open_Socket ...
:
  State := IPX_Close_Socket (Socket);
  IF State <> SUCCESS THEN
  BEGIN
    Writeln ('Error ');
    EXIT;
  END;
:
:


FUNCTION IPX_Send ( Socket : WORD; Dest_Addr : Network_Address; Buffer : SData) : BYTE;

Описание:
Функция посылает данные одной или или нескольким станциям в сети.

Данные могут посылаться либо конкретной станции, либо сразу всем станциям в режиме "Broadcast".
Должен быть указан полный сетевой адрес.
Напомним, что номер сети задается сетевым администратором при установке Novell NetWare на сервер.
Если станция-получатель находится в той же сети, что и передающая станция, то в поле "Network" можно задать нулевое значение ($0000).
Для отправки пакета на все станции в сети (режим Broadcast), в качестве номера узла необходимо указать значение $FFFFFFFFFFFF, т.е. во все шесть байт номера узла должно быть занесено значение $FF.
Максимальная длина передаваемых данных не должна превышать 546 байт.
Фактическую длину данных нужно обязательно указывать.

Параметры:
Socket = Номер сокета, через который посылаются данные.
(номер сокета указывается в 16-ричной форме)

Dest_Addr = Полный сетевой адрес станции-получателя (или нескольких получателей).

Buffer = Буфер для размещения передаваемых данных и указания их длины.

Возвращаемое значение:
SUCCESS
Запрос на отправку данных успешно принят драйвером IPX.

PARAMETER_ERROR
Либо указанный сокет не существует, либо не заполнен адрес сети, либо неправильно заполнен буфер.

NO_DESTINATION
Не найден путь к станции-получателю.

Пример:
VAR
  State       : BYTE;
  Destination : Network_Address;
  Daten       : SData;
:
:
  IPX_Setup ...
:
  IPX_Open_Socket ...
:
  WITH Destination DO
  BEGIN
    Network[1] := $00;
    Network[2] := $00;
    Network[3] := $00;
    Network[4] := $00;

    Node[1] := $02;
    Node[2] := $60;
    Node[3] := $8C;
    Node[4] := $13;
    Node[5] := $FF;
    Node[6] := $AB;

    Socket := $5000;
  END;
:
  WITH Daten DO
  BEGIN
    Daten.Data := ...
    Daten.Length := ...
  END;
:
  State := IPX_Send (Socket,Destination, Daten);
  IF State <> SUCCESS THEN
  BEGIN
    Writeln ('Error');
    IPX_Close_Socket ...
    EXIT;
  END;
:
:


FUNCTION IPX_Receive ( Socket : WORD ) : BYTE;

Описание:
Функция принимает данные от удаленной станции.

Проверка завершения приема данных осуществляется с помощью функции IPX_Done.

Параметры:
Socket = Номер принимающего сокета (задается в 16-чной форме).

Возвращаемое значение:
SUCCESS
Запрос на прием данных воспринят драйвером IPX с глубоким удовлетворением.

PARAMETER_ERROR
Указанный сокет не существует.

DEVICE_SW_ERROR
Драйвер IPX недоступен.

Пример:
VAR
  State  : BYTE;
  Socket : WORD;

:
:
  IPX_Setup ...
:
  IPX_Open_Socket ...
:
:
  State := IPX_Receive (Socket);
  IF State <> SUCCESS THEN
  BEGIN
    Writeln ('Error');
    IPX_Close_Socket ...
    EXIT;
  END;
:
:


FUNCTION IPX_Done ( Socket : WORD; Code : BYTE;
                            VAR Source_Addr : Network_Address;
                            VAR Buffer : SData ) : BYTE;

Описание:
Функция возвращает статус ранее запущенной операции с IPX.
Она позволяет определить, завершена или нет последняя операция с данным сокетом, а также - готовы ли данные для приема.

Параметры:
Socket = Номер сокета, для которого проверяется завершение операции
(номер сокета должен указываться в 16-ричной форме).

Code = Код операции, завершение которой будет проверяться.
Этот параметр может иметь следующие значения:
SEND - для проверки статуса функции IPX_Send;
RECEIVE - для проверки статуса функции IPX_Receive.

Source_Addr = Возвращаемое функцией значение сетевого адреса удаленной станции, от которой получены данные.

Buffer = Буфер, в который помещаются принятые данные.

Возвращаемое значение:
SUCCESS
Указанная функция завершена успешно.

NOT_ENDED
Указанная функция еще не завершена.

PARAMETER_ERROR
Неверный параметр при вызове функции, или указанный сокет не существует.

DEVICE_SW_ERROR
Драйвер IPX недоступен.

DEVICE_HW_ERROR
Отправка пакета физически невозможна из-за аппаратного сбоя.

PACKET_BAD
Неверная длина пакета (меньше 30 байт, или больше 546 байт).

PACKET_UNDELIVERIABLE
Доставка пакета невозможна (например, в сети не найдена станция-получатель).

PACKET_OVERFLOW
Принятый пакет слишком велик, и не помещается в Buffer.

Пример:
VAR
  State   : BYTE;
  Socket  : WORD;
  Adresse : Network_Address;
  Daten   : SData;

:
:
  IPX_Setup ...
:
  IPX_Open_Socket ...
:
  IPX_Send ...
:
  State := IPX_Done (Socket, SEND, Adresse, Daten);
  WHILE State = NOT_ENDED DO
    State := IPX_Done (Socket, SEND, Adresse, Daten);
:
:

ИЛИ

:
:
  IPX_Receive ...
:
  State := IPX_Done (Socket, RECEIVE, Adresse, Daten);
  IF State = SUCCESS THEN
  BEGIN
    Read Data ...
:
:


FUNCTION IPX_Internetwork_Address ( VAR Network : S4Byte; VAR Node : S6Byte ) : BYTE;

Описание:
Функция возвращает адрес сети и адрес собственного узла, т.е. станции, на которой запущена функция.

Параметры:
Network = Номер сети

Node = Номер узла

Возвращаемое значение:
SUCCESS
Функция выполнена успешно.

Пример:
VAR
  State : BYTE;
  Net   : S4Byte;
  Node  : S6Byte;
:
:
  IPX_Setup ...
:
  State := IPX_Internetwork_Address (Net,Node);
:
:


FUNCTION IPX_To_Addr ( Network : String; Node : String;
                        Socket : String; VAR Addr : Network_Address; ) : BYTE;

Описание:
Функция конвертирует входные строки в стуктуру данных типа Network_Address.

Параметры:
Network = Номер сети

Node = Номер узла

Socket = Номер сокета

Addr = Возвращаемый результат конвертирования.

Возвращаемое значение:
SUCCESS
Конвертирование прошло успешно.

PARAMETER_ERROR
Входные параметры не могут быть сконвертированы.




FUNCTION IPX_From_Addr ( Addr : Network_Address; VAR Network : String;
                              VAR Node : String; VAR Socket : String; ) : BYTE;


Описание:
Функция конвертирует полный сетевой адрес в строковые переменные.

Параметры:
Addr = Полный сетевой адрес

Network = Номер сети

Node = Номер узла

Socket = Номер сокета

Возвращаемое значение:
SUCCESS
Конвертирование прошло успешно.

PARAMETER_ERROR
Указанный адрес не может быть сконвертирован.



6. Ограничения и проблемы
При использовании библиотеки следует обратить особое внимание на следующие моменты:

  • После вызова функций IPX_Send и IPX_Receive обязательно должна быть запущена функция IPX_Done.
    Следующее обращение к указанным функциям для одного и того же сокета допустимо только после завершения предыдущей операции.
    Невыполнение данного требования чревато потерей передаваемых данных.

  • Функция IPX_Send может посылать данные в сеть быстрее, чем функции IPX_Receive и IPX_Done могут их принимать.

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

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

  • IPX является протоколом, не требующим подключения, т.е. доставка пакетов не гарантирована. Если передающая сторона отправляет данные настолько быстро, что принимающая станция не успевает их получить или обработать, то при этом передающая станция никак не сможет узнать об этом прискорбном событии...

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

  • Следующий важный принцип состоит в том, что перед завершением приложения все открытые коммуникационные сокеты должны быть закрыты.
    Это необходимо для того, чтобы очистить все внутренние стуктуры данных библиотеки и драйвера IPX.



Литература
[1] NetWare System Interface Technical Overview, Novell Incorporated,
     Novell Part # 100-000569-001.

[1a] NetWare System Calls-DOS Volume I and II, Novell Development Products Division,
     Novell Part # 100-0005571-001.

[2] LAN Protocol Handbook, Mark A. Miller, P.E., M&T Books, ISBN 1-55851-099-0

[3] Turbo Pascal Version 6.0. Руководство Пользователя, Borland Int.