Informatica
Programarea sub dos folosind comunicatia in retea ipxPROGRAMAREA SUB DOS FOLOSIND COMUNICATIA IN RETEA IPXLucrarea va prezenta modul de utilizare a protocolului IPX pentru comunicarea intre aplicatii rezidand pe acelasi calculator sau pe calculatoare diferite. Exemplele anexate sunt realizate in limbaj de asamblare. Pentru inceput trebuie lamurite o serie de aspecte legate de problemele ridicate de aceste comunicatii. De asemenea trebuie explicate anumite concepte nou introduse de programarea in retea. 1 Prezentarea protocolului IPXIPX face parte din stiva de comunicatie nativa Novell. A aparut ca o adaptare a arhitecturii Xerox Network Systems (XNS). De aceea a pastrat si conformitatea cu Xerox Internetwork Datagram Protocol (IDP). Desi in cadrul unei retele Novell acest protocol (IPX) este intotdeauna prezent, pentru utilizarea acestui protocol de comunicatie nu este necesara prezenta unei retele Novell Netware (sa ne reamintim ca o retea Novell Netware presupunea servere cu roluri importante). IPX este la urmaa urmei o simpla interfata de programare care permite comunicattia intre aplicatii prin intermediul retelei locale. De aceea multe placi de retea sunt livrate direct cu software-ul de retea IPX, sub forma driverelor. Chiar firma Novell vinde astfel de pachete software minimale, Personal Netware, la preturi nesemnificative. 2 Notiuni de bazaSocket: Putem asemana comunicatiile prin intermediul IPX cu distributia curentului electric prin retea: la capatul ei exista cateva prize la care se conecteaza aparatele. Fiecare se conecteaza la alta priza (socket) totusi, desi toate se folosesc de acelasi protocol. Prin acest identificator driverele care asigura comunicatia IPX pot sa recunoasca in mod unic aplicatiile ce ruleaza pe o masina si sa stie cui si de la cine sa tramsmita datele necesare. ECB: Niste aplicatii care ruleaza pe aceeasi masina DOS nu au prea multe cai de a schimba informatii intre ele. La fel sta situatia si in cazul comunicatiei intre o aplicatie dorind sa comunice cu driverele de protocol IPX. Transferul fluxului de date prin intermediul unor fisiere este evident o metoda cel putin greoaie. De aceea solutia este folosirea unei zone de memorie comuna, in care se completeaza informatia atat de catre aplicatie cat si de catre driver. Acest buffer numit Event Control Block este construit de catre aplicatie si are o structura bine definita.
Valorile mai intalnite ale indicatorului de stare:
Cateva din codurile de completare, in functie de contextul folosirii ECB-ului:
ESR: Nu vom intra in prea multe amanunte in legatura cu Event Service Routine. Ideea este ca putem sa-I spunem driverului de protocol IPX sa apeleze aceasta functie de cate ori primeste un pachet, pentru a ne anunta astfel. Utilizarea este deci similara nnotiunii de intrerupere. Aceasta functie este apelata cu: AL=FFh (identificator IPX), ES:SI adresa ECB si intreruperile dezactivate. Prezenta sau absenta acestei functii se comunica driverului prin intermediul ECB. Dar, in afara de anumite cazuri in care viteza programului este absolut necesara, putem folosi linistiti polling-ul pentru verificarea starii cozii de pachete. Fragment: Intr-un ECB pot preciza mai multe fragmente ale informatiei care trebuie transmisa sub forma unui singur pachet. De exemplu un fragment ar putea fi antetul (header) pachetului IPX, pe cand al doilea fragment ar fi datele ce urmeaza sa fie transmise in el. Daca tot am vorbit de acest header, sa-I discutam structura:
Tipul pachetului poate fi: 0. Tip necunoscut 1. Pachet de informatii rutare 2. Ecou 3. Eroare 4. Pachet IPX 5. Pachet SPX 16-31. Protocoale experimentale 17. NetWare Core Protocol 3 Programarea IPXAcestea fiind spuse, putem trece la studiul interfetei de programare API pe care ne-o pune la dispozitie driverul IPX. Aceasta este intreruperea 7Ah. Vom observa ca selectia subserviciului acestei intreruperi se face cu ajutorul registrului BX, nu cu AH cum eram obisnuiti la alte intreruperi. Bineinteles ca in cazul absentei driverului IPX, nimeni nu a instalat in memorie rutinele acestei intreruperi, iar programele noastre nu vor face nimic. Desi este pastrata in continuare, folosirea intreruperii 7A nu este recomandata la versiuni Netware mai mari de 2.0, in locul acesteia folosesc serviciul 7A al INT 2F pentru a obtine o adresa FAR de salt, la care sar cu registrii pregatiti ca si la apelul intreruperii vechi. Vom prezenta aici doar cateva functii, utilizarea celorlalte reiesind din documentatie. Deschidere socket: BX = 0000h AL = durata de viata socket: 00h - deschis pana la inchidere explicita sau terminare program FFh - deschis pana la inchidere explicita DX = numar socket: 0000h - alocat dinamic (intre 4000h-7FFFh) altfel, numarul dorit la returnare, vom avea in AL codul: 00h - succes, cu numarul alocat socket in DX FEh - tabela de socket plina FFh - socket deschis deja Inchidere socket: BX = 0001h DX = numarul socket (octetii aranjati astfel incat MSB va fi in DL!) (un program trebuie sa-si inchida toate sockets deschise de el) Obtinerea adresei: BX = 0009h ES:SI -> un buffer unde se va afla adresa locala (la retur SI nu mai e valabil!) Adresa are formatul: 4 octeti identificator retea (big endian) 6 octeti identificator nod (big endian) Trimitere pachet: BX = 0003h ES:SI -> ECB - bufferul de transfer date catre/de la driverul IPX Functia returneaza imediat, pachetul fiind trimis in fundal! E sarcina mea sa verific indicatorul de stare din ECB, iar la terminare sa citesc codul de completare sa vad cum s-a terminat tentativa de trimitere a pachetului. Cedare control: BX = 000Ah E o functie foarte importanta! Dupa cum stim, DOS nu este multitasking, adica nu permite rularea mai multor progranme in acelasi timp. Deci aplicatia noastra monopolizeaza procesorul, iar driverul IPX nuu are cand sa trimita pachetul. De aceea apelam aceasta intrerupere din cand in cand ca sa cedam controlul driverului IPX sa-si faca si el treaba un timp. Asteptare pachet: BX = 0004h ES:SI -> ECB pentru primirea pachetului Returneaza: AL = starea: 00h succes, FFh nu exista socket respectiv Nici aceasta functie nu asteapta primirea pachetului! De asemenea trebuie sa citesc periodic ECB-ul pentru a afla despre terminarea primirii din fundal (indicatorul de stare). 4 Exemplu de programIata codul pentru o aplicatie simpla care trimite un pachet in retea: STIVA SEGMENT PARA STACK 'STACK' dw 256 dup (0) STIVA ENDS DATE SEGMENT PARA PUBLIC 'DATA' eroareSock db "Eroare alocare socket",0Dh,0Ah,'$' initiatTrimis db "Pachet trimis",0Dh,0Ah,'$' terminat db "Program terminat cu succes",0Dh,0Ah,'$' ECBtip strucECB IPXtip strucIPXsend DATE ENDS COD SEGMENT PARA PUBLIC 'CODE' ASSUME CS:COD, DS:DATE, ES:DATE, SS:STIVA MAIN PROC FAR push DS xor AX,AX push AX mov AX,DATE mov DS,AX mov ES,AX ;incerc sa deschid un socket alocat dinamic mov BX,0 ;(nu ma intereseaza un anumit numar de socket) mov AL,0 mov DX,0 int 7Ah cmp AL,0 ;daca nu am reusit afisez eroarea si ies jnz mesajSock mov ECB.Sock,DX mov IPXsend.SursaSock,DX mov SI, offset IPXsend.SursaNet mov BX,9 ;citesc adresa locala direct in struct header IPX int 7Ah mov ECB.FragAdr, offset IPXsend.Suma mov ECB.FragSeg, segment IPXsend.Suma mov AX, IPXsend.Lung mov ECB.FragSize, AX ;am completat ce campuri mai ramasesera mov BX,3 mov SI, offset ECB.LinkAdr int 7Ah ;trimit pachetul format dintr-un singur fragment mov DX,offset initiatTrimis mov AH,9 int 21h netrimis: mov BX,0Ah int 7Ah cmp ECB.InUse,0 jnz netrimis mov BX,1 mov DX, ECB.Sock int 7Ah mov DX,offset terminat mov AH,9 int 21h ret mesajSock: mov DX,offset eroareSock mov AH,9 int 21h ret MAIN ENDP COD ENDS END MAIN 6 TemeCa posibile dezvoltari ale acestei aplicatii, mentionam si necesitatea unui test initial al existentei intreruperii 7Ah. Evident daca nu exista driverul IPX care sa lase rezidente in memorie rutinele apelate de INT 7Ah si care sa scrie adresa lor in TVI, primul apel al intreruperii ne va bloca sistemul. In continuare, se poate scrie absolut analog si aplicatia care sa receptioneze pachetul IPX, si eventual sa si afiseze datele receptionate. Apoi se vor integra cele 2 aplicatii intr-una singura care sa implementeze un dialog simplu intre 2 statii.
|