Локальные сети персональных компьютеров Использование протоколов IPX, SPX, NETBIOS

         

IPXCancelEvent - отменить событие


На входе: BX = 06h.
ES:SI = Указатель на блок ECB.
На выходе: AL = Код завершения:

00h - функция выполнена без ошибок;

F9h - обработка ECB не может быть отменена;



FFh - указанный ECB не используется.



IPXCloseSocket - закрыть сокет


На входе: BX = 01h.
DX = Номер закрываемого сокета.
На выходе: Регистры не используются.



IPXDisconnectFromTaget - отключиться от партнера


На входе: BX = 0Bh.
ES:SI = Указатель на структуру, содержащую сетевой адрес станции:

struct NetworkAddress { unsigned char Network[4]; unsigned char Node[6]; unsigned char Socket[2]; }

На выходе: Регистры не используются.



IPXGetInternetworkAddress - получить собственный адрес


На входе: BX = 09h.
ES:DI = Указатель на буфер длиной 10 байт, в который будет записан адрес станции, на которой работает данная программа. Адрес состоит из номера сети Network и адреса станции в сети Node.
На выходе: Регистры не используются.



IPXGetIntervalMarker - получить интервальный маркер


На входе: BX = 08h.
На выходе: AX = Интервальный маркер.



IPXGetLocalTaget - получить непосредственный адрес


На входе: BX = 02h.
ES:SI = Указатель на буфер длиной 12 байт, содержащий полный сетевой адрес станции, на которую будет послан пакет.
ES:DI = Указатель на буфер длиной 6 байт, в который будет запи-сан непосредственный адрес, т. е. адрес той станции, которой будет передан пакет. Это может быть адрес моста.
На выходе: AL = Код завершения:

00h - непосредственный адрес был успешно вычислен;

FAh - непосредственный адрес вычислить невозможно, так как к указанной станции нет ни одного пути доступа по сети.

CX = Время пересылки пакета до станции назначения (только если AL равен 0) в тиках системного таймера. Тики таймера следуют с периодом примерно 1/18 секунды.



IPXListenForPacket - принять IPX-пакет


На входе: BX = 04h.
ES:DI = Указатель на заполненный блок ECB. Необходимо заполнить поля:

ESRAddress;

Socket;

FragmentCnt;

указатели на буферы фрагментов Address;

размеры фрагментов Size.

На выходе: Регистры не используются.



IPXOpenSocket - открыть сокет


На входе: BX = 00h.
AL = Тип сокета:

00h - короткоживущий;

FFh - долгоживущий.

DX = Запрашиваемый номер сокета или 0000h, если требуется получить динамический номер сокета.

Примечание. Байты номера сокета находятся в перевернутом виде.

На выходе: AL = Код завершения:

00h - сокет открыт;

FFh - этот сокет уже был открыт раньше;

FEh - переполнилась таблица сокетов.

DX = Присвоенный номер сокета.



IPXRelinquishControl - выделить время драйверу IPX


На входе: BX = 0Ah.
На выходе: Регистры не используются.



IPXSceduleIPXEvent - отложить событие


На входе: BX = 05h.
AX = Время задержки в тиках таймера
ES:SI = Указатель на блок ECB.
На выходе: Регистры не используются.



IPXSendPacket - передать IPX-пакет


На входе: BX = 03h.
ES:DI = Указатель на заполненный блок ECB. Необходимо заполнить поля:

ESRAddress;

Socket;

ImmAddress;

FragmentCnt;

указатели на буферы фрагментов Address;

размеры фрагментов Size.В заголовке пакета IPX необходимо заполнить поля:

PacketType;

DestNetwork;

DestNode;

DestSocket.

На выходе: Регистры не используются.



SPXAbortConnection - закрыть канал аварийно


На входе: BX = 14h.
DX = Номер канала связи.
На выходе: Регистры не используются.



SPXCheckInstallation - инициализировать SPX


На входе: BX = 10h.
AL = 00h.
На выходе: AL = Код завершения:

00h - SPX не установлен;

FFh - SPX установлен.

BH = Верхний (major) номер версии SPX.
BL = Нижний (minor) номер версии SPX.
CX = Максимальное количество каналов SPX, поддерживаемых драйвером SPX.
DX = Количество доступных каналов SPX.



SPXEstablishConnection - создать канал с передающей стороны


На входе: BX = 11h
AL = Счетчик повторов попыток создать канал связи.
AH = Флаг включения системы периодической проверки связи (Watchdog Supervision Required Flag).
ES:SI = Указатель на блок ECB
На выходе: AL = Промежуточный код завершения:

00h - выполняется попытка создать канал;

FFh - указанный в блоке ECB сокет закрыт;

FDh - сбойный пакет: либо счетчик фрагментов не равен 1, либо размер фрагмента не равен 42;

EFh - переполнение локальной таблицы номеров каналов связи.
DX Присвоенный номер канала.



SPXGetConnectionStatus - получить состояние канала


На входе: BX = 15h.
DX = Номер канала связи.
ES:SI = Указатель на буфер размером 44 байта.
На выходе: AL = Код завершения:

00h - канал активен;

EEh - указанный канал не существует.



SPXListenForConnection - создать канал с принимающей стороны


На входе: BX = 12h.
AL = Счетчик повторов попыток создать канал связи.
AH = Флаг включения системы периодической проверки связи (Watchdog Supervision Required Flag).
ES:SI = Указатель на блок ECB.
На выходе: Регистры не используются.



SPXListenForSequencedPacket - принять SPX-пакет


На входе: BX = 17h.
ES:SI = Указатель на блок ECB.
На выходе: Регистры не используются.



SPXSendSequencedPackett - передать SPX-пакет


На входе: BX = 16h.
ES:SI = Указатель на блок ECB
DX = Номер канала связи.
На выходе: Регистры не используются.



SPXTerminateConnection - закрыть канал


На входе: BX = 13h
ES:SI = Указатель на блок ECB
DX = Номер канала связи
На выходе: Регистры не используются.



NB_AddGroupName (0xB6)


Команда аналогична предыдущей, за исключением того, что она выполняется без ожидания и в поле Cmd необходимо записать значение 0xB6.



NB_AddName (0xB0)


Команда аналогична предыдущей, за исключением того, что она выполняется без ожидания и в поле Cmd необходимо записать значение 0xB0.



NB_Call (0x90)


Команда аналогична предыдущей, за исключением того, что она выполняется без ожидания и в поле Cmd необходимо записать значение 0x90.



NB_ChainSend (0x97)


Команда аналогична предыдущей, за исключением того, что она выполняется без ожидания и в поле Cmd необходимо записать значение 0x97.



NB_ChainSendNoAck (0xF2)


Команда аналогична предыдущей, за исключением того, что она выполняется без ожидания и в поле Cmd необходимо записать значение 0xF2.



NB_DeleteName (0xB1)


Команда аналогична предыдущей, за исключением того, что она выполняется без ожидания и в поле Cmd необходимо записать значение 0xB1.



NB_HangUp (0x92)


Команда аналогична предыдущей, за исключением того, что она выполняется без ожидания и в поле Cmd необходимо записать значение 0x92.



NB_Listen (0x91)


Команда аналогична предыдущей, за исключением того, что она выполняется без ожидания и в поле Cmd необходимо записать значение 0x91.



NB_Receive (0x95)


Команда аналогична предыдущей, за исключением того, что она выполняется без ожидания и в поле Cmd необходимо записать значение 0x95.



NB_ReceiveAny (0x96)


Команда аналогична предыдущей, за исключением того, что она выполняется без ожидания и в поле Cmd необходимо записать значение 0x96.



NB_ReceiveBroadcastDatagram (0xA3)


Команда аналогична предыдущей, за исключением того, что она выполняется без ожидания и в поле Cmd необходимо записать значение 0xA3.



NB_ReceiveDatagram (0xA1)


Команда аналогична предыдущей, за исключением того, что она выполняется без ожидания и в поле Cmd необходимо записать значение 0xA1.



NB_Send (0x94)


Команда аналогична предыдущей, за исключением того, что она выполняется без ожидания и в поле Cmd необходимо записать значение 0x94.



NB_SendBroadcastDatagram (0xA2)


Команда аналогична предыдущей, за исключением того, что она выполняется без ожидания и в поле Cmd необходимо записать значение 0xA2.



NB_SendDatagram (0xA0)


Команда аналогична предыдущей, за исключением того, что она выполняется без ожидания и в поле Cmd необходимо записать значение 0xA0.



NB_SendNoAck (0xF1)


Команда аналогична предыдущей, за исключением того, что она выполняется без ожидания и в поле Cmd необходимо записать значение 0xF1.



NB_SessionStatus (0xB4)


Команда аналогична предыдущей, за исключением того, что она выполняется без ожидания и в поле Cmd необходимо записать значение 0xB4.



NB_WAddGroupName (0x36) - добавить групповое имя


Поля NCB на входе Содержимое
Cmd 0x36
OurName Добавляемое групповое имя
PostRoutine Дальний указатель на POST-программу или нулевое значение, если POST-программа не используется
AdapterNumber Номер адаптера; 0 - первый адаптер, 1 - второй

Поля NCB на выходе Содержимое
NetworkNameNumber Присвоенный номер имени
CCode Промежуточный код завершения команды
FinalCCode Окончательный код завершения команды



NB_WAddName (0x30) - добавить имя


Поля NCB на входе Содержимое
Cmd 0x30
OurName Добавляемое имя
PostRoutine Дальний указатель на POST-программу или нулевое значение, если POST-программа не используется
AdapterNumber Номер адаптера; 0 - первый адаптер, 1 - второй

Поля NCB на выходе Содержимое
NetworkNameNumber Присвоенный номер имени
CCode Промежуточный код завершения команды
FinalCCode Окончательный код завершения команды



NB_WCall (0x10) - создать канал с передающей стороны


Поля NCB на входе Содержимое
Cmd 0x10
CallName Имя, с которым устанавливается канал
OurName Имя станции, создающей канал
ReceiveTimeout Время ожидания приема, в 1/2 с
SendTimeout Время ожидания передачи, в 1/2 с
PostRoutine Дальний указатель на POST-программу или нулевое значение, если POST-программа не используется
AdapterNumber Номер адаптера; 0 - первый адаптер, 1 - второй

Поля NCB на выходе Содержимое
LocalSessionNumber Присвоенный номер канала
CCode Промежуточный код завершения команды
FinalCCode Окончательный код завершения команды



NB_WCancel (0x35) - отменить команду


Поля NCB на входе Содержимое
Cmd 0x35
Buffer Указатель на блок NCB, для которого отменяется команда
AdapterNumber Номер адаптера; 0 - первый адаптер, 1 - второй

Поля NCB на выходе Содержимое
FinalCCode Окончательный код завершения команды



NB_WChainSend (0x17) - передать данные через канал, используя сцепленные буферы


Поля NCB на входе Содержимое
Cmd 0x17
LocalSessionNumber Номер используемого канала
Buffer Указатель на первый буфер, содержащий передаваемые данные
Size Размер первого буфера
CallName Первые два байта содержат размер второго буфера, следующие четыре байта - дальний адрес второго буфера
PostRoutine Дальний указатель на POST-программу или нулевое значение, если POST-программа не используется
AdapterNumber Номер адаптера; 0 - первый адаптер, 1 - второй

Поля NCB на выходе Содержимое
CCode Промежуточный код завершения команды
FinalCCode Окончательный код завершения команды



NB_WChainSendNoAck (0x72) - передать


Поля NCB на входе Содержимое
Cmd 0x72
LocalSessionNumber Номер используемого канала
Buffer Указатель на первый буфер, содержащий передаваемые данные
Size Размер первого буфера
CallName Первые два байта содержат размер второго буфера, следующие четыре байта - дальний адрес второго буфера
PostRoutine Дальний указатель на POST-программу или нулевое значение, если POST-программа не используется
AdapterNumber Номер адаптера; 0 - первый адаптер, 1 - второй

Поля NCB на выходе Содержимое
CCode Промежуточный код завершения команды
FinalCCode Окончательный код завершения команды



NB_WDeleteName (0x31) - удалить имя


Поля NCB на входе Содержимое
Cmd 0x31
OurName Удаляемое имя
PostRoutine Дальний указатель на POST-программу или нулевое значение, если POST-программа не используется
AdapterNumber Номер адаптера; 0 - первый адаптер, 1 - второй

Поля NCB на выходе Содержимое
CCode Промежуточный код завершения команды
FinalCCode Окончательный код завершения команды



NB_WHangUp (0x12) - закрыть канал


Поля NCB на входе Содержимое
Cmd 0x12
LocalSessionNumber Номер закрываемого канала
PostRoutine Дальний указатель на POST-программу или нулевое значение, если POST-программа не используется
AdapterNumber Номер адаптера; 0 - первый адаптер, 1 - второй

Поля NCB на выходе Содержимое
CCode Промежуточный код завершения команды
FinalCCode Окончательный код завершения команды



NB_WListen (0x11) - создать канал с принимающей стороны


Поля NCB на входе Содержимое
Cmd 0x11
CallName Имя, с которым устанавливается канал. Если в первый байт имени записать символ "*", канал будет установлен с любой вызывающей станцией
OurName Имя станции, создающей канал с принимающей стороны
ReceiveTimeout Время ожидания приема, в 1/2 с
SendTimeout Время ожидания передачи, в 1/2 с
PostRoutine Дальний указатель на POST-программу или нулевое значение, если POST-программа не используется
AdapterNumber Номер адаптера; 0 - первый адаптер, 1 - второй

Поля NCB на выходе Содержимое
LocalSessionNumber Присвоенный номер канала
CallName В это поле записывается имя вызвавшей станции, если при установлении канала было указано имя "*"
CCode Промежуточный код завершения команды
FinalCCode Окончательный код завершения команды



NB_WReceive (0x15) - принять данные через канал


Поля NCB на входе Содержимое
Cmd 0x15
LocalSessionNumber Номер используемого канала
Buffer Указатель на буфер, используемый для записи принятых данных
Size Размер буфера
PostRoutine Дальний указатель на POST-программу или нулевое значение, если POST-программа не используется
AdapterNumber Номер адаптера; 0 - первый адаптер, 1 - второй

Поля NCB на выходе Содержимое
Size Количество принятых и записанных в буфер байт данных
CCode Промежуточный код завершения команды
FinalCCode Окончательный код завершения команды



NB_WReceiveAny (0x16) - принять данные через канал от любого имени


Поля NCB на входе Содержимое
Cmd 0x16
NetworkNameNumber Номер имени или 0xFF
Buffer Указатель на буфер, используемый для записи принятых данных
Size Размер буфера
PostRoutine Дальний указатель на POST-программу или нулевое значение, если POST-программа не используется
AdapterNumber Номер адаптера; 0 - первый адаптер, 1 - второй

Поля NCB на выходе Содержимое
Size Количество принятых и записанных в буфер байт данных
NetworkNameNumber Номер имени станции, от которой пришли данные
CCode Промежуточный код завершения команды
FinalCCode Окончательный код завершения команды



NB_WReceiveBroadcastDatagram (0x23)


Поля NCB на входе Содержимое
Cmd 0x23
NetworkNameNumber Номер, присвоенный при добавлении имени или 0xFF
Buffer Адрес буфера, содержащего передаваемые данные
Size Размер буфера
PostRoutine Дальний указатель на POST-программу или нулевое значение, если POST-программа не используется
AdapterNumber Номер адаптера; 0 - первый адаптер, 1 - второй

Поля NCB на выходе Содержимое
CallName Имя станции, от которой получена датаграмма
Size Размер принятого блока данных
CCode Промежуточный код завершения команды
FinalCCode Окончательный код завершения команды



NB_WReceiveDatagram (0x21) - принять датаграмму


Поля NCB на входе Содержимое
Cmd 0x21
NetworkNameNumber Номер, присвоенный при добавлении имени или 0xFF
Buffer Адрес буфера, содержащего передаваемые данные
Size Размер буфера
PostRoutine Дальний указатель на POST-программу или нулевое значение, если POST-программа не используется
AdapterNumber Номер адаптера; 0 - первый адаптер, 1 - второй

Поля NCB на выходе Содержимое
CallName Имя станции, от которой получена датаграмма
Size Размер принятого блока данных
CCode Промежуточный код завершения команды
FinalCCode Окончательный код завершения команды



NB_WResetAdapter (0x32) - сбросить сетевой адаптер


Поля NCB на входе Содержимое
Cmd 0x32
LocalSessionNumber Максимальное количество каналов или 0 для использования значения по умолчанию
NetworkNameNumber Максимальное количество блоков NCB или 0 для использования значения по умолчанию
AdapterNumber Номер адаптера; 0 - первый адаптер, 1 - второй

Поля NCB на выходе Содержимое
FinalCCode Окончательный код завершения команды



NB_WSend (0x14) - передать данные через канал


Поля NCB на входе Содержимое
Cmd 0x14
LocalSessionNumber Номер используемого канала
Buffer Указатель на буфер, содержащий передаваемые данные
Size Размер буфера
PostRoutine Дальний указатель на POST-программу или нулевое значение, если POST-программа не используется
AdapterNumber Номер адаптера; 0 - первый адаптер, 1 - второй

Поля NCB на выходе Содержимое
CCode Промежуточный код завершения команды
FinalCCode Окончательный код завершения команды



NB_WSendBroadcastDatagram (0x22) - послать датаграмму одновременно всем станциям


Поля NCB на входе Содержимое
Cmd 0x22
NetworkNameNumber Номер, присвоенный при добавлении имени
Buffer Адрес буфера, содержащего передаваемые данные
Size Размер буфера
PostRoutine Дальний указатель на POST-программу или нулевое значение, если POST-программа не используется
AdapterNumber Номер адаптера; 0 - первый адаптер, 1 - второй

Поля NCB на выходе Содержимое
CCode Промежуточный код завершения команды
FinalCCode Окончательный код завершения команды



NB_WSendDatagram (0x20) - послать датаграмму


Поля NCB на входе Содержимое
Cmd 0x20
NetworkNameNumber Номер, присвоенный при добавлении имени
CallName Имя станции, которой передаются данные
Buffer Адрес буфера, содержащего передаваемые данные
Size Размер буфера
PostRoutine Дальний указатель на POST-программу или нулевое значение, если POST-программа не используется
AdapterNumber Номер адаптера; 0 - первый адаптер, 1 - второй

Поля NCB на выходе Содержимое
CCode Промежуточный код завершения команды
FinalCCode Окончательный код завершения команды



NB_WSendNoAck (0x71) - передать данные через канал без подтверждения


Поля NCB на входе Содержимое
Cmd 0x71
LocalSessionNumber Номер используемого канала
Buffer Указатель на буфер, содержащий передаваемые данные
Size Размер буфера
PostRoutine Дальний указатель на POST-программу или нулевое значение, если POST-программа не используется
AdapterNumber Номер адаптера; 0 - первый адаптер, 1 - второй

Поля NCB на выходе Содержимое
CCode Промежуточный код завершения команды
FinalCCode Окончательный код завершения команды



NB_WSessionStatus (0x34) - получить состояние канала


Название поля Назначение поля
NameNumber Номер имени канала
SessionCount Количество каналов
DatagramsOutstanding Количество выданных команд на прием датаграмм
ReceiveAnyoutstanding Количество выданных команд на прием командой NB_ReceiveAny
Session Массив структур, описывающих каждый канал в отдельности
LocalSessionNumber Номер канала
State Состояние канала:

1 - ожидание завершения команды NB_Listen;

2 - ожидание завершения команды NB_Call;

3 - канал установлен;

4 - ожидание завершения команды NB_HangUp;

5 - команда NB_HangUp завершила свое вы-

полнение;

6 - канал закрыт с ошибкой.

LocalName Имя локальной станции
RemoteName Имя удаленной станции
ReceiveCount Количество ожидающих завершения команд NB_Receive
SendCount Количество ожидающих завершения команд NB_Send

Поля NCB на входе Содержимое
Cmd 0x34
Buffer Дальний адрес буфера для приема информации о состоянии каналов
Size Размер буфера
OurNames Имя канала, для которого необходимо получить информацию о состоянии. В качестве имени можно указывать "*"
PostRoutine Дальний указатель на POST-программу или нулевое значение, если POST-программа не используется
AdapterNumber Номер адаптера; 0 - первый адаптер, 1 - второй

Поля NCB на выходе Содержимое
Size Размер заполненной части буфера
CCode Промежуточный код завершения команды
FinalCCode Окончательный код завершения команды



РАБОТА С IPX, SPX И NETBIOS В СРЕДЕ MS WINDOWS


8.1.

8.2.

Создание программ, специально предназначенных для работы в среде Microsoft Windows, не является предметом обсуждения в данной книге. Однако мы сделаем несколько замечаний относительно использования протоколов IPX, SPX и NETBIOS в программах, работающих в среде Microsoft Windows версии 3.1 и Microsoft Windows for Workgroups версии3.1.



к Microsoft Windows for Workgroups


Замечания, сделанные выше, относятся и к Microsoft Windows for Workgroups версии 3.1. Однако эта операционная система может и не поддерживать протоколы IPX/SPX. С помощью приложения Control Panel вы можете подключить или отключить поддержку сети Novell NetWare и протоколов IPX/SPX.

Если поддержка Novell NetWare не используется, вам доступен протокол NETBIOS, который является "родным" протоколом для Windows for Workgroups.

Мы проверили работу NETBIOS через интерфейс прерывания INT 2Ah при работе в виртуальной машине MS-DOS. Сразу после загрузки сетевых драйверов Windows for Workgroups интерфейс NETBIOS недоступен. Однако в среде виртуальной машины MS-DOS этот интерфейс появляется.

Приведем два фрагмента системы "клиент-сервер", проверенной нами при работе в Windows for Workgroups. Вы сможете найти полные исходные тексты на дискете, которая продается вместе с книгой (эти исходные тексты почти полностью повторяют тексты системы "клиент-сервер", работающей с датаграммами).

Первый фрагмент проверяет присутствие интерфейса NETBIOS:

// Проверяем наличие интерфейса NETBIOS

regs.h.ah = 0; int86(0x2a, &regs, &regs); errno = 0;

if(regs.h.ah == 0) { errno=0xff; }

Второй фрагмент предназначен для вызова NETBIOS через прерывание INT 2Ah:

// Функция для вызова NETBIOS

void NetBios(void) { sregs.es = FP_SEG(&ncb); regs.x.bx = FP_OFF(&ncb); regs.h.ah = 0x4; regs.h.al = 0x1; int86x(0x2a, &regs, &regs, &sregs); }


Все резидентные программы, имеющие отношение


Все резидентные программы, имеющие отношение к сетевой оболочке Novell NetWare, необходимо загружать до запуска Windows. Это относится и к эмулятору протокола NETBIOS. Если вы запустите эти программы из виртуальной машины MS-DOS, работающей в среде WIndows, рано или поздно произойдет аварийное завершение Windows.

Если ваша программа работает в среде MS-DOS с протоколами IPX, SPX или NETBIOS, она без всяких изменений будет работать и на виртуальной машине Windows. Вам только надо проследить, чтобы все резидентные программы и эмулятор NETBIOS загружались до запуска Windows.

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

Вы можете выйти из такого затруднительного положения, если воспользуетесь интерфейсом с защищенным режимом DPMI (DOS Protected Mode Interface), описанным нами в томе "Библиотеки системного программиста", по-священном использованию защищенного режима.

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