IPX, Politechnika Śląska w Gliwicach


Politechnika Śląska w Gliwicach

Instytut Informatyki

Laboratorium Sieci Komputerowych

Temat:

„INTERFEJS PROGRAMOWY PROTOKOŁU

KOMUNIKACYJNEGO IPX/SPX”

1. Cel i zadania do wykonania w ramach laboratorium.

Laboratorium jest podzielone na dwie części. Część pierwsza poświęcona jest omówieniu przez prowadzącego zajęcia podstaw protokołu komunikacyjnego IPX/SPX jak oraz zapoznaniu się z interfejsem programowym tego protokołu komunikacyjnego.

Druga część przeznaczona jest na praktyczne wykorzystanie omawianego interfejsu do napisania programu (systemu) który komunikuje się z innymi stacjami w sieci za pomocą protokołu komunikacyjnego IPX/SPX.

2. Protokół komunikacyjny IPX/SPX.

Protokół komunikacyjny IPX/SPX jest firmową implementacją protokołu międzysieciowego rodziny XNS (Xerox Network Systems). Przeznaczenie tego protokołu to sieci typu LAN (Local Area Network).Udostępnia on podstawowe usługi komunikacyjne umożliwiające przesyłanie informacji pomiędzy stacjami roboczymi (pod pojęciem stacji roboczej mam na myśli każdy komputer) przyłączonymi do sieci, zaopatrzonymi w ten protokół. Protokół IPX/SPX jest w zasadzie połączeniem dwóch protokołów IPX i SPX:

Pakiet protokołu IPX/SPX ma zawsze stałą długość, która wynosi 576 bajtów z czego, w przypadku protokołu IPX 30 bajtów, w przypadku protokołu SPX 42 bajty są przeznaczone na nagłówek. Jak łatwo zauważyć, używając jednego pakietu można przesłać tylko (!) 546 bajtów informacji w przypadku protokołu IPX i 534 bajty w przypadku protokołu SPX.

Wielkość pakietu została ustalona na podstawie badań efektywności przesyłania danych ze względu na ilość kolizji bezpieczeństwo informacji (zakłócenia) itp.

Dokładna postać ramki dla obydwu protokołów przedstawiona jest w dalszej części instrukcji.

Chcąc wykorzystywać protokół IPX/SPX we własnych aplikacjach należy zwrócić uwagę na drobny, ale istotny szczegół. Otóż w procesorach rodziny INTEL przyjęto konwencję, iż w ciągu bajtów pierwszy jest najmniej znaczący (low/high byte order).W protokole IPX/SPX natomiast przyjęto konwencję odwrotną.

Podstawą wykorzystania protokołu IPX/SPX we własnych aplikacjach jest znajomość podstawowych struktur tego protokołu:

Istnieją jeszcze inne struktury, które jednak nie będą nam potrzebne na tym etapie zaawansowania.

Przed użyciem odpowiednich struktur należy najpierw zarezerwować dla nich miejsce w pamięci operacyjnej.

2.1. Adresacja w protokole IPX/SPX.

Protokół IPX/SPX jak każdy protokół komunikacyjny posiada swój własny tryb adresacji pozwalający na jednoznaczną identyfikację procesu komunikującego się za pomocą tego protokołu. Postać adresu wykorzystywanego przez protokół IPX/SPX jest identyczny z postaciami adresów protokołów rodziny XNS. Całkowity adres składa się z dwunastu bajtów i jednoznacznie identyfikuje proces w obrębie sieci jako całości. Rysunek poniżej przedstawia postać adresu protokołu IPX/SPX.

A B C

bajt

..

..

..

..

..

..

..

..

..

..

..

4b 6b 2b

Rys 1.

Postać adresu protokołu IPX/SPX.

W przedstawionej postaci adresu wyróżnia się trzy części, które w sumie tworzą adres jednoznacznie identyfikujący proces komunikujący się z wykorzystaniem protokołu IPX/SPX:

Poniżej przedstawiono przykładową deklarację (w języku C) struktury adresu protokołu IPX/SPX.

#define BYTE unsigned char

#define WORD unsigned int

typedef struct IPXAddress

{

BYTE network[4]; //numer sieci

BYTE node[6]; //numer stacji

WORD socket; //numer gniazda

}IPXAddress;

Przykład deklaracji struktury adresu protokołu IPX/SPX.

Ze względu na sposób przekazywania informacji wyróżnia się dwa tryby adresowania:

2.2. Blok sterowania zdarzeniami.

Podstawą korzystania z protokołu IPX/SPX jest znajomość struktury sterowania zdarzeniami - ECB (Event Control Block), której wymagają najważniejsze polecenia protokołu

(m.in. funkcja wysyłająca pakiety i ustawiająca nasłuch na pakiety nadchodzące). Struktura ECB składa się z szeregu pól, lecz tylko niektóre trzeba wypełnić aby móc korzystać z protokołu IPX/SPX (w zależności od używanej funkcji).

Poniżej przedstawiono przykładową deklarację (w języku C) struktury bloku sterowania zdarzeniami dla protokołu IPX i SPX.

#define BYTE unsigned char

#define WORD unsigned int

#define NWPTR far *

typedef struct ECBFragment

{

void NWPTR address; //adres bufora roboczego

WORD size; //rozmiar buf. W bajtach

}ECBFragment;

typedef struct ECB

{

void NWPTR linkAddress; //wsk. Następnego bloku

void (NWPTR ESRAddress)(); //adres procedury ESR

BYTE inUseFlag; //zaawansowanie zlecenia

BYTE completionCode; //kod realizacji zlec.

WORD socketNumber; //nr gniazda zw.ze zlec.

BYTE IPXWorkspace[4]; //pole rob. Mod. IPX/SPX

BYTE driverWorkspace[12]; //pole rob. prog. adapt.

BYTE immediateAddress[6]; //adr. stacji lub mostka

WORD fragmentCount; //ilość buf. roboczych

ECBFragment fragmentDescriptor[5]; //tablica adresów

//rozmiarów buforów

//roboczych (w tym

//przyp. 5-cio

//elementowa)

}ECB;

Przykład deklaracji struktury bloku sterowania zdarzeniami (ECB) protokołu IPX/SPX.

Poszczególne pola oznaczają:

  1. 00H - w porządku.

  1. FCH - skasowano.

  1. FDH - zła postać ramki.

  1. FEH - ramka nie może być dostarczona (brak adresata, awaria itp.).

  1. FFH - ramki nie można wysłać.

  1. 00H - w porządku.

  2. FCH - skasowano.

  3. FDH - brak miejsca w buforach.

  4. FFH - gniazdo zamknięte.

Blok ECB można modyfikować tylko wtedy gdy nie jest z nim związane żadne zlecenie (pole inUseFlag równe zero). Dla różnych zleceń wymagane jest poprawne wypełnienie tylko niektórych pól bloku ECB (patrz opis funkcji modułu IPX/SPX). W danym momencie jeden blok ECB może być związany tylko z jednym zleceniem IPX/SPX.

  1. Nagłówek protokołu IPX/SPX.

Jak zapewne każdy zauważył nagłówek (header) IPX/SPX jest wymagany przy poprawnym konstruowaniu bloku ECB. To właśnie w nagłówku definiuje się adresy odbiorcy i nadawcy pakietu oraz inne informacje niezbędne dla poprawnej realizacji zleceń (oczywiście tych, które wymagają bloku ECB). Nagłówki protokołu IPX i SPX różnią się nieco od siebie, dlatego zarówno jeden jak i drugi zostaną przedstawione w tym punkcie.

Poniżej podano przykładowe deklaracje obydwu nagłówków wraz z opisem znaczenia poszczególnych pól.

#define BYTE unsigned char

#define WORD unsigned int

typedef struct IPXAddress

{

BYTE network[4]; //numer sieci

BYTE node[6]; //numer stacji

WORD socket; //numer gniazda

}IPXAddress;

typedef struct IPXHeader

{

WORD checkSum; //suma kontrolna

WORD length; //długość pakietu

BYTE transportControl; //pole kontrolne-licznik

BYTE packetType; //typ pakietu

IPXAddress destination; //adres przeznaczenia

IPXAddress source; //adres źródła

}IPXHeader;

Przykład deklaracji struktury nagłówka protokołu IPX.

Poszczególne pola oznaczają:

Kod

Typ pakietu

0

Nieznany typ pakietu.

1

Pakiet protokołu RIP (Routing Information Packet).

2

Pakiet typu „Echo”

3

Pakiet typu „Error”

Kod

Typ pakietu

4

„Packet Exchange Packet” (IPX).

5

„Sequenced Packet Protocol Packet” (SPX).

16-31

Pakiety protokołów eksperymentalnych.

17

Pakiet protokołu kontrolnego NCP.

20

Pakiet protokołu NetBIOS.

Korzystając z usług protokołu IPX należy wartość w tym polu ustawiać na zero lub cztery.

Nagłówek protokołu SPX:

#define BYTE unsigned char

#define WORD unsigned int

typedef struct IPXAddress

{

BYTE network[4]; //numer sieci

BYTE node[6]; //numer stacji

WORD socket; //numer gniazda

}IPXAddress;

typedef struct SPXHeader

{

WORD checkSum; //suma kontrolna

WORD length; //długość pakietu

BYTE transportControl; //pole kontrolne-licznik

BYTE packetType; //typ pakietu

IPXAddress destination; //adres przeznaczenia

IPXAddress source; //adres źródła

BYTE connectionControl; //sterowanie połączeniem

BYTE dataStreamType; //typ przes. danych

WORD sourceConnectionID;//identyfikator nadawcy

WORD destConnectionID; //identyfikator odbiorcy

WORD sequenceNumber; //licznik pak. wysłanych

WORD acknowledgeNumber; //numer spodz. pakietu

WORD allocationNumber; //ilość wolnych buforów

}SPXHeader;

Przykład deklaracji struktury nagłówka protokołu SPX.

Struktura nagłówka SPX zawiera 30 bajtów nagłówka IPX, które mają dokładnie takie samo znaczenie i przeznaczenie (z tą różnicą, że pole packetType przyjmuje wartość 5 - pakiet protokołu SPX) i siedem dodatkowych pól o następującym znaczeniu:

Bity

Znaczenie

0-3

Nieużywane.

4

Koniec wiadomości.

5

Zarezerwowane.

6

Żądanie potwierdzenia.

7

Pakiet systemowy.

Struktury nagłówków nie mogą być modyfikowane jeżeli związane jest z nimi jakieś zlecenie.

Znajomość przedstawionych struktur jest niezbędna do poprawnego korzystania z usług protokołu IPX/SPX.

  1. Interfejs programowy protokołu IPX/SPX.

Aby skorzystać z usług protokołu IPX/SPX musimy mieć pewien zbiór funkcji dostarczonych przez producenta protokołu, realizujących podstawowe usługi (zakładając, że protokół jest zainstalowany na naszej stacji ). Funkcje protokołu zarówno IPX jak i SPX są dostępne w wielu formach. Dla aplikacji tworzonych dla systemu operacyjnego DOS stworzone są specjalne biblioteki (dla protokołu IPX funkcje w systemie DOS dostępne są pod przerwaniem 7AH), dla programujących pod systemem Windows 3.x/95 istnieją różne biblioteki (DLL) np. „NWIPXSPX.DLL” (aby korzystać z tych funkcji potrzebne są jeszcze następujące pliki: „NWCALDEF.H”, „NWDIAG.H”, „NWIPXSPX.H”, „NWSAP.H” , „NXTW.H”, oraz „NWIPXSPX.LIB”), dla OS/2 (32-bit), Windows 95 i Windows NT - „NWSIPX.DLL” (oraz dodatkowe pliki nagłówkowe). Funkcje dla różnych systemów działają w identyczny sposób (różnice są na innym poziomie: przydziału pamięci, zarządzania zasobami itp.). W związku z tym poniżej zostały przedstawione funkcje dla systemu DOS (funkcja dla pozostałych systemów są analogiczne i niewiele się różnią).

Funkcje (konwencja w języku C) protokołu IPX (alfabetycznie):

Kod zwracany

Znaczenie

00H

Funkcja zakończyła się sukcesem.

F9H

Blok ECB nie może być usunięty z kolejki zdarzeń.

FFH

Z blokiem ECB nie było związane żadne zlecenie.

Moduł IPX po wywołaniu tej funkcji ustawia pole inUseFlag bloku ECB na wartość FEH oznaczającą, że blok ECB jest w stanie oczekiwania na nadejście pakietu. Dodaje go także do kolejki bloków ECB nasłuchujących na nadejście pakietu z tego samego gniazda. Moduł IPX nie wprowadza ograniczeń co do ilości bloków ECB mogących na raz nasłuchiwać na nadejście ramki. Gdy pakiet dotrze, IPX wpisuje dane do pierwszego w kolejce bloku ECB (tzn. do niego i buforów z nim skojarzonych), ustawia wartość w polu inUseFlag na 00H i wywołuje procedurę ESR (której adres był wcześniej wpisany do pola ESRAddress bloku ECB) o ile taką zdefiniowaliśmy. Funkcja zwraca następujące wartości (w polu completionCode bloku ECB):

Zwracany kod

Znaczenie

00H

Operacja zakończyła się sukcesem.

FCH

Żądanie odrzucone.

FDH

Błędny pakiet

FFH

Gniazdo nie jest otworzone

Funkcja zwraca następujące wartości:

Zwracany kod

Znaczenie

0000H

Operacja zakończyła się sukcesem.

00F0H

IPX nie jest zainstalowany.

00FEH

Brak wolnych gniazd

00FFH

Gniazdo jest już otworzone.

Zwracany kod

Znaczenie

00H

Pakiet wysłany ale dostarczenie nie gwarantowane.

FCH

Żądanie odrzucone.

FDH

Błąd długości nagłówka IPX

FEH

Nie można dostarczyć pakietu.

FFH

Błąd sprzętowy.

Ponieważ w ramach laboratorium będziemy realizowali programy wykorzystujące głównie protokół IPX, funkcje protokołu SPX zostaną przedstawione bez dokładnego opisu (zainteresowanych odsyłam do dokumentacji novell'owej lub na strony www firmy Novell, gdzie są one opisane dokładnie). Funkcje Protokołu SPX(konwencja C; kolejność alfabetyczna):

#define NWAPI far pascal

BYTE watchDog, WORD NWPTR SPXConnID, ECB NWPTR eventControlBlock) - nawiązanie połączenia.

CONNECTION_INFO NWPTR connectionInfo) - zwraca informację o połączeniu.

WORD maxPacketSize, BYTE NWPTR majorRevisionNumber,

BYTE NWPTR minorRevisionNumber, WORD NWPTR maxConnections,

WORD NWPTR availableConnections) - inicjalizuję struktury modułu SPX.

BYTE watchDog, ECB NWPTR eventControlBlock) - nasłuchiwanie na propozycję połączenia.

ECB NWPTR eventControlBlock) - nasłuchiwanie pakiety (w fazie połączenia).

ECB NWPTR eventControlBlock) - wysyłanie pakietów (w fazie połączenia)

ECB NWPTR eventControlBlock) - przerwanie połączenia.

  1. Etapy w programowaniu z wykorzystaniem protokołu IPX.

W punkcie tym przedstawiono schemat i kolejne kroki jakie należy wykonać aby poprawnie wykorzystać protokół komunikacyjny IPX.

  1. Rezerwacja miejsca na potrzebne struktury (bloki ECB, nagłówki, bufory danych itp.).

  1. Wywołanie funkcji inicjującej moduł IPX (sprawdzeni, czy IPX jest zainstalowany itp.).

  1. Otworzenie potrzebnych gniazd.

  1. ...(przed wywołaniem funkcji wymagających bloku ECB należy pamiętać o poprawnym jego, jak i buforów skojarzonych, wypełnieniu).

  1. Zamknięcie gniazd, które otworzyła aplikacja na czas wykonania.

  1. Zwolnienie pamięci przydzielonej na potrzebne struktury.



Wyszukiwarka