Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
А4_Методичка.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
4 Мб
Скачать
☆

4.2.2 Визначення в комп’ютерній мережі присутності мережевих пристроїв та присутності драйверів. [19]

Робота з драйвером IPX / SPX. Перше, що повинна зробити програма, яка бажає працювати в КМ з протоколом IPX / SPX, - перевірити, чи встановлено драйвер відповідного протоколу. Потім необхідно отримати адресу виклику цього драйвера - точку входу API (Application Programm Interface - інтерфейс для додатків). Надалі програма викликає драйвер за допомогою команди міжсегментного виклику процедури за адресою точки входу API драйвера IPX / SPX.

Точка входу API драйвера IPX / SPX. Для того щоб перевірити, завантажений драйвер IPX, необхідно завантажити в регістр AX значення 7A00h і викликати мультиплексной переривання INT 2Fh.

Якщо після повернення з переривання в регістрі AL буде значення FFh, драйвер IPX завантажений. Адреса точки входу для виклику API драйвера при цьому буде знаходитися в регістровій парі ES: DI.

Якщо ж вміст регістра AL після повернення з переривання INT 2Fh буде відмінним від FFh, драйвер IPX / SPX не завантажений. Це означає, що на даній РС не завантажені резидентні програми ipx.exe або ipxodi.exe, що забезпечують API для роботи з протоколами IPX і SPX.

Для виклику API в регістр BX необхідно завантажити код виконуваної функції. Значення, що завантажуються в інші регістри, залежать від виконуваної функції. Наприклад, функція з кодом 10h використовується для перевірки присутності в системі протоколу SPX (може бути така ситуація, коли протокол IPX присутній, а SPX - ні). Для того, щоб визначити наявність SPX, необхідно завантажити в BX значення 10h, в AX значення 00h і викликати API драйвера IPX. Якщо після повернення регістр AX буде містити значення FFh, протокол SPX присутній і може бути використаний. У регістрах CX і DX передаються параметри SPX - максимальне число каналів зв'язку, яке ця РС може встановити з програмами, які працюють на інших РС, і кількість каналів, доступних в даний час.

Наведемо текст програми, яка визначає наявність драйвера протоколів IPX і SPX (див. ПП. 15 на CD). Програма викликає функції ipx_init () і ipxspx_entry (), тексти яких знаходяться в ПП. 15. Текст скороченого варіанту include-файлу ipx.h представлений в лістингу. [20]

Можна спробувати запустити цю програму на РС КМ Novell NetWare під керуванням MS-DOS або на віртуальній машині MS Windows, яка працює в розширеному (Enchanced) режимі.

Далі розташований вихідний текст модуля ініціалізації IPX (див. ПП. 16 на CD).

У цьому модулі знаходиться функція ipxspx_entry (), необхідна для виклику драйвера IPX / SPX. Її ім'я починається з символу "_", що необхідно для виконання угоди про імена в мові Сі.

Тут же є функція ipx_init (), яка перевіряє наявність драйвера в системі, отримує адресу API драйвера і зберігає його в області ОП _ipxspx_drv_entry.

Описи типів і констант, а також прототипи функцій для програми ipxver.c знаходяться у файлі ПП17.h (див. ПП. 17 на CD).

Використання API драйвера IPX. Тепер, коли відомо як перевіряти наявність драйвера IPX і визначати точку входу для виклику його API, вивчимо як користуватися API. Від того, наскільки добре буде освоєний API драйвера IPX, залежать успіхи у створенні ПЗ для КМ Novell NetWare.

Спочатку розберемося зі структурою програм, здатних обмінюватися даними по КМ, і зрозуміти, як програми, що працюють на різних РС, можуть передавати один одному ці самі дані.

Схема «клієнт-сервер». Зазвичай в КМ одна з РС приймає запити на виконання будь-яких дій від інших РС. Так як станція обслуговує запити, вона називається сервером (serve - обслуговувати, server - обслуговуючий пристрій). Виконавши запит, сервер посилає відповідь в запит РС, яка називається клієнтом.

У КМ може бути багато серверів і багато клієнтів. Одні й ті ж клієнти можуть надсилати запити різних серверів.

Більш правильно, сервером / клієнтом є не РС, а запущена на ній програма. У мультизадачності середовищі різні програми, запущені одночасно на одній і тій же РС можуть бути і клієнтами, і серверами.

Програма-сервер, виконавши черговий запит, переходить в стан очікування. Вона чекає приходу пакета даних від програми-клієнта. У залежності від вмісту цього пакету програма-сервер може виконувати різні дії, відповідно до логіки роботи програми. Наприклад, вона може прийняти від програми-клієнта додаткові пакети даних або передати свої пакети.

Сервер і клієнт при необхідності на якийсь час або назавжди можуть помінятися місцями, змінивши своє призначення на протилежне.

Для того, щоб створювати програми-сервери і програми-клієнти, нам необхідно навчитися виконувати два завдання: ініціалізацію сервера і клієнта; прийом і передачу пакетів даних.

Ініціалізація сервера і клієнта. Для ініціалізації програм сервера і клієнта, які працюють на базі IPX, недостатньо переконатися в наявності відповідного драйвера і отримати точку входу в його API. Необхідно ще виконати деякі підготовчі дії для того, щоб програма могла приймати і передавати пакети даних. Перш за все необхідно, щоб програма-сервер або програма-клієнт ідентифікували себе в мережі за допомогою механізму сокетів.

Для зберігання сокета використовується двухбайтовое слово, тож діапазон можливих значень простирається від 0 до FFFFh, але можна використовувати довільні значення. Значення зарезервовані для використання певними програмами, так звані "добре відомі" сокети ("well-known" sockets).

Так як протокол IPX є практичною реалізацією протоколу Xerox Internetwork Packet Protocol, первинний розподіл сокетів виконується фірмою Xerox. Згідно з цим розподілом сокети від 0 до 3000 зарезервовані статично за певним ПЗ. Зокрема, фірма Novell отримала від фірми Xerox діапазон сокетів для своєї мережевої ОС NetWare. У специфікації Xerox сокети зі значенням, більшим ніж 3000, можуть розподілятися динамічно.

Динамічно розподіляються сокети видаються програм як би в тимчасове користування (на час їх роботи) за спеціальним запитом. Перед початком роботи програма повинна запитати сокет у протоколу IPX, а перед завершенням - звільнити його.

Розподіл сокетів в КМ Novell NetWare дещо відрізняється від розподілу, встановленого фірмою Xerox. Сокети від 0 до 4000h зарезервовані і не повинні використовуватися в ПЗ користувачів. Сокети від 4000h до 8000h розподіляються динамічно. Діапазон "добре відомих" сокетів, що розподіляються Novell персонально розробникам ПЗ, розташований вище значення 8000h.

Розробник ПЗ для КМ NetWare, може для своєї програми скористатися сокетом, отриманим динамічно. Можна задавати сокет як параметр при запуску програми. Якщо використовуване значення сокета конфліктує з іншим ПЗ, то необхідно змінити його, просто ставлячи нове значення для відповідного параметра.

При реалізації схеми обміну даними "клієнт-сервер" сервер зазвичай приймає пакети на сокеті, значення якого відомо програмам-клієнтам. Самі ж програми-клієнти можуть використовувати або те ж саме значення сокета, або отримувати свій сокет динамічно. Клієнт може повідомити сервер свій сокет просто передавши його в пакеті даних (так як ми припускаємо, що сокет сервера відомий програмі-клієнту).

Після визначення сокета необхідно дізнатися мережеву адресу РС-одержувачів. Для того, щоб клієнт міг послати запит серверу, необхідно окрім сокета сервера знати його мережеву адресу - номер КМ і адресу РС в КМ.

Якщо програма-клієнт знає тільки сокет програми-сервера, але не знає його мережеву адресу, останній можна запитати у сервера, надіславши запит на усі РС одночасно. Такий запит у КМ одного її сегмента можна виконати, якщо в якості адреси РС вказати значення FFFFFFFFFFFFh, так званий "широкомовний" (broadcast) адреса.

Клієнт надсилає запит на відомий йому сокет програми-сервера і використовує адресу FFFFFFFFFFFFh. Такий запит приймають всі програми на всіх РС, які очікують пакети на даному сокеті. Отримає його і наша програма-сервер. А вона може визначити свою власнуу мережеву адресу (виконавши виклик відповідної функції IPX) та надіслати його клієнту. Адреса ж клієнта програма-сервер може взяти із заголовка прийнятого пакету.

Є спосіб визначення адреси РС по імені користувача, що підключився на ній до файл-серверу. Це можна зробити за допомогою API мережевий оболонки РС (резидентна програма netx.exe). Однак цей спосіб не дозволяє визначати адресу РС, на якій не виконано підключення до файл-серверу або не запущена мережева оболонка netx.exe. Пакет, переданий за адресою FFFFFFFFFFFFh, буде прийнятий усіма РС КМ навіть у тому випадку, якщо файл-сервер вимкнений або його зовсім немає. Тому спосіб визначення мережевої адреси через запит по всій КМ є універсальним.