Home - qdidactic.com
Didactica si proiecte didacticeBani si dezvoltarea cariereiStiinta  si proiecte tehniceIstorie si biografiiSanatate si medicinaDezvoltare personala
referate stiintaSa fii al doilea inseamna sa fii primul care pierde - Ayrton Senna





Aeronautica Comunicatii Drept Informatica Nutritie Sociologie
Tehnica mecanica


Informatica


Qdidactic » stiinta & tehnica » informatica
Programarea sub dos folosind comunicatia in retea ipx



Programarea sub dos folosind comunicatia in retea ipx


PROGRAMAREA SUB DOS FOLOSIND COMUNICATIA IN RETEA IPX



Lucrarea 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 IPX


IPX 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 baza


Socket: 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.



Offset

Nume camp

Dimensiune

Observatii

0h

Adresa legatura

DWORD

Folosit de driver pentru organizarea listei de ECB

4h

Adresa ESR

DWORD

NULL daca nu folosesc ESR

8h

Indicator stare (in-use flag)

BYTE

Verificat continuu de aplicatie

9h

Cod terminare operatie

BYTE

Completat de catre driver

0Ah

Numar socket

WORD

Trebuie sa existe deja socket deschis!

0Ch

Spatiu IPX

BYTE * 4


10h

Spatiu driver

BYTE * 12


1Ch

Adresa imediata

BYTE * 6


22h

Numar fragmente

WORD


24h

Adresa fragment 1

DWORD


28h

Marime fragment 1

WORD



.pentru celelalte fragmente idem.




Valorile mai intalnite ale indicatorului de stare:


Cod

Semnificatie

0h

Disponibil

F8h

Aplicatia a incercat sa trimita un pachet si IPX era ocupat. ECB si pachetul stau in asteptare in coada.

FAh

IPX tocmai proceseaza ECB

FBh

IPX foloseste ECB pentru un eveniment care tocmai a sosit. ECB sta in asteptare in coada.

FCh

IPX foloseste ECB pentru un eveniment programat de AES (nu de IPX) care inca nu s-a declansat

FDh

IPX foloseste ECB pentru un eveniment programat care inca nu s-a declansat

FEh

IPX asteapta pachete pe socket

FFh

IPX foloseste ECB pentru a trimite pachetul



Cateva din codurile de completare, in functie de contextul folosirii ECB-ului:


Cod

Emisie

Ascultare

Programare eveniment

Anulare eveniment

00h

succes

succes

succes

succes

FCh

anulat

anulat

anulat


FDh

pachet eronat

depasire



FEh

transmisie nereusita




FFh

eroare fizica

socket inchis



F9h


esec





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:


Offset

Nume camp

Dimensiune

0

Suma de control

WORD

2

Lungime

WORD

4

Control transport

BYTE

5

Tip pachet

BYTE

6

Adresa destinatie

BYTE[12]

18

Adresa sursa

BYTE[12]



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 IPX


Acestea 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 program


Iata 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 Teme


Ca 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.



Contact |- ia legatura cu noi -| contact
Adauga document |- pune-ti documente online -| adauga-document
Termeni & conditii de utilizare |- politica de cookies si de confidentialitate -| termeni
Copyright © |- 2024 - Toate drepturile rezervate -| copyright