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


Пример c использованием ESR


В предыдущем примере при ожидании пакета мы опрашивали в цикле поле InUse блока ECB. Однако более эффективным является использование программы ESR. Эта программа получает управление тогда, когда пакет принят и поле InUse установлено в ноль.

Когда ESR получает управление, регистры процессора содержат следующие значения:

AL идентификатор вызывающего процесса:

FFh - программа ESR вызвана драйвером IPX;

00h - программа ESR вызвана планировщиком асинхронных событий AES (будет описан позже);

ES:SI адрес блока ECB, связанного с данной ESR.

Содержимое всех регистров, кроме SS и SP, а также флаги процессора записаны в стек программы.

Если ESR будет обращаться к глобальным переменным программы, необходимо правильно загрузить регистр DS. Непосредственно перед вызовом ESR прерывания запрещаются. Функция ESR не возвращает никакого значения и должна завершать свою работу командой дальнего возврата RETF. Перед возвратом управления прерывания должны быть запрещены.

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

Наша программа-ESR (листинг 8) выполняет простую задачу - записывает адрес связанного с ней блока ECB в глобальную переменную completed_ecb_ptr, которая сбрасывается в главной программе перед ожиданием приема пакета. Программа-клиент (листинг 7), ожидая прихода пакета, выполняет какие-либо действия (в нашем случае она просто вводит символы с клавиатуры и выводит их на экран) и периодически опрашивает глобальную переменную. Как только пакет будет принят, в эту переменную будет записан отличный от нуля адрес блока ECB.

// =================================================== // Листинг 7. Клиент IPX // Файл ipxclien.c // // (C) A. Frolov, 1993 // ===================================================

#include <stdio.h> #include <stdlib.h> #include <conio.h> #include <mem.h> #include <string.h> #include <dos.h> #include "ipx.h"




- Начало -  - Назад -  - Вперед -