15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту

Библиотека Системного Программиста. Том 8
Локальные сети персональных компьютеров. Использование протоколов IPX, SPX, NETBIOS

8. Приложение 4. РАБОТА С IPX, SPX И NETBIOS В СРЕДЕ MS WINDOWS

8.1. Работа в среде Microsoft Windows версии 3.1

8.2. Работа в среде Microsoft Windows for Workgroups версии 3.1

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

8.1. Работа в среде Microsoft Windows версии 3.1

Все резидентные программы, имеющие отношение к сетевой оболочке 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 есть функции, с помощью которых вы можете заказать для программы защищенного режима буферы, расположенные в первом мегабайте основной оперативной памяти.

Работа в среде Microsoft Windows for Workgroups версии 3.1

Замечания, сделанные выше, относятся и к 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);
        }