Você está na página 1de 7

Achiziţia şi Prelucrarea Datelor____________________________________________Laborator 05

5 Comunicaţii TCP/IP

5.1 Scopul lucrării


În acest laborator se studiază posibilităţile de transmitere a datelor între sisteme utilizând
protocolul de comunicaţie TCP/IP. Se vor dezvolta atât aplicatii de tip server, cât şi de tip client.
Mai întâi se va testa comunicaţia datelor pe TCP/IP pe acelaşi sistem (localhost), apoi între diverse
calculatoare din reţeaua laboratorului.

5.2 Generalităţi
Modelul TCP/IP (Transmission Control Protocol/Internet Protocol) a fost creat de US DoD
(US Department of Defence - Ministerul Apărării Naţionale al Statelor Unite) din necesitatea unei
reţele care ar putea supravieţui în orice condiţii. DoD dorea ca, atâta timp cât funcţionau maşina
sursă şi maşina destinaţie, conexiunile să rămână intacte, chiar dacă o parte din maşini sau din
liniile de transmisie erau brusc scoase din funcţiune. Era nevoie de o arhitectură flexibilă, deoarece
se aveau în vedere aplicaţii cu cerinţe divergente, mergând de la transferul de fişiere până la
transmiterea vorbirii în timp real.
Aceste cerinţe au condus la alegerea a patru niveluri pentru modelul TCP/IP: Aplicaţie,
Transport, Reţea (sau Internet) şi Acces la Reţea.
Nivelul Aplicaţie nu este identic cu cel din modelul ISO-OSI. Acesta include ultimele trei
niveluri superioare din stiva OSI. Acestea au fost comasate pentru a putea fi tratate la un loc toate
problemele legate de protocoale de nivel înalt, fie ele de reprezentare, codificare sau control al
dialogului. El conţine toate protocoalele de nivel înalt. Primele protocoale de acest gen includeau
terminalul virtual (TELNET), transfer de fişiere (FTP) şi poşta electronică (SMTP).
Pe parcursul anilor la aceste protocoale s-au adăugat multe altele, aşa cum sunt: DNS
(Domain Name Service), NNTP, HTTP etc.
Nivelul Transport este identic cu cel din modelul OSI, ocupându-se cu probleme legate de
siguranţă, control al fluxului şi corecţie de erori. El este proiectat astfel încât să permită conversaţii
între entităţile pereche din gazdele sursă, respectiv, destinaţie. În acest sens au fost definite două
protocoale capăt-la-capăt.
Primul din ele este TCP (Trasmission Control Protocol). El este un protocol sigur orientat pe
conexiune care permite ca un flux de octeţi trimişi de pe o maşină să ajungă fără erori pe orice altă
maşină din inter-reţea. Acest protocol fragmentează fluxul de octeţi în mesaje discrete şi pasează
fiecare mesaj nivelului internet. TCP tratează totodată controlul fluxului pentru a se asigura că un
emiţător rapid nu inundă un receptor lent cu mai multe mesaje decât poate acesta să prelucreze.
Al doilea protocol din acest nivel, UDP (User Datagram Protocol), este un protocol nesigur,
fără conexiuni, destinat aplicaţiilor care doresc să utilizeze propria lor secvenţiere şi control al
fluxului. Protocolul UDP este de asemenea mult folosit pentru interogări rapide întrebare-răspuns,
client-server şi pentru aplicaţii în care comunicarea promptă este mai importantă decât comunicarea
cu acurateţe, aşa cum sunt aplicaţiile de transmisie a vorbirii şi a imaginilor video.
Nivelul Reţea (Internet) - scopul nivelului este de a asigura transmiterea pachetelor de la
orice sursă din reţea şi livrarea lor către o destinaţie independent de calea şi reţelele pe care le-a
străbătut pentru a ajunge acolo. Determinarea drumului optim şi comutarea pachetelor au loc la
acest nivel.
Nivelul Internet defineşte oficial un format de pachet şi un protocol numit IP (Internet
Protocol). Sarcina nivelului Internet este să livreze pachete IP către destinaţie. Problemele majore se
referă la dirijarea pachetelor şi evitarea congestiei. În consecinţă este rezonabil să presupunem că
nivelul Internet din TCP/IP funcţionează asemănător cu nivelul reţea din OSI.

1
Achiziţia şi Prelucrarea Datelor____________________________________________Laborator 05
Nivelul Acces la reţea se ocupă cu toate problemele legate de transmiterea efectivă a unui
pachet IP pe o legătură fizică, incluzând şi aspectele legate de tehnologii şi de medii de transmisie,
adică nivelurile OSI Legătură de date şi Fizic.
Modelul de referinţă TCP/IP nu spune mare lucru despre ce se întâmplă acolo, însă
menţionează că gazda trebuie să se lege la reţea, pentru a putea trimite pachete IP, folosind un
anumit protocol. Acest protocol nu este definit şi variază de la gazdă la gazdă şi de la reţea la reţea.

5.3 Librăria TCP/IP în CVI


Modelul de comunicare folosind TCP/IP pus la dispoziţie de CVI implică un client şi un
server pentru fiecare conexiune. Există posibilitatea ca mai mulţi clienţi să se conecteze la acelaşi
server şi respectiv un PC poate avea mai multe servere, dar pentru comunicaţie de date între două
sisteme este suficient să fie un server si un client.
Un server TCP poate trimite şi recepţiona informaţii de la una sau mai multe aplicaţii de tip
client prin intermediul reţelei, la fel şi în cazul invers. Un server care a fost înregistrat rămâne în
aşteptarea cererilor de la diferiţi clienţi. O aplicaţie poate fi proiectată astfel încât să poată îndeplini,
funcţie de necesităţi, atât funcţia de server cât şi pe cea de client. Sub sistemul de operare Windows
avem posibilitatea ca pe aceeaşi maşină să se poată executa simultan şi un client şi un server.
Pentru a realiza comunicarea de date între cele două sisteme server – client, mediul CVI
pune la dispoziţie diverse funcţii specializate pentru implementarea diferitelor operaţii: înregistrarea
serverului, conectarea clientului, citirea datelor, transmiterea datelor, preluarea erorilor etc. În cele
ce urmează se vor prezenta atât modul de lucru, cât şi funcţiile necesare realizării unui server,
respectiv client.

5.3.1 Server TCP/IP

Dacă aplicaţia trebuie să fie de tip server atunci pentru iniţializare este necesară înregistrarea
serverului folosind funcţia RegisterTCPServer. Această funcţie va realiza asocierea dintre
programul aplicaţie şi perechea definitorie nume server + număr port . Funcţia de răspuns (callback)
ataşată serverului va fi apelată de fiecare dată când apare nevoia unei comunicaţii fie într-o direcţie,
fie în alta. Această funcţie trebuie să aibă următorul prototip:

int CallbackName(unsigned handle, int xType, int errCode, void


*callbackData);

Descrierea parametrilor:
- handle: acest parametru reprezintă identificatorul liniei de comunicaţie între client şi
server. OBSERVAŢIE: mediul CVI atribuie un identificator liniei de comunicaţie la
conectarea unui client la server. Acest identificator de comunicaţie va fi pasat ca valoare
în parametrul handle la autoapelul funcţiei de callback mai sus prezentată. Acest
identificator (variabila handle) va trebui salvat într-o variabilă globală utilizată
ulterior în operaţiile de write şi read (transmisie/recepţie) ale serverului;
- xType: specifică tipul de eveniment care a generat autoapelul funcţiei de callback a
serverului. Poate avea valorile TCP_CONNECT, TCP_DISCONNECT, TCP_DATAREADY (a
se vedea descrierea de mai jos);
- errCode: la deconectarea unui client (xType = TCP_DISCONNECT ) acest parametru
specifică dacă clientul a fost deconectat datorită unei probleme pe mediul de comunicare
sau dacă clientul s-a deconectat în mod intenţionat;
- callbackData: parametru de 4 octeţi transmişi de fiecare dată când se autoapelează
funcţia de callback a serverului;

2
Achiziţia şi Prelucrarea Datelor____________________________________________Laborator 05
În tabelul următor sunt prezentate tipurile de evenimente care generează autoapelul funcţiei
de callback a serverului, precum şi descrierile acestora:

Tabel 1 Evenimentele care generează autoapelul funcţiei de callback a serverului


Nr. Crt. Eveniment (xType) Descriere
1. TCP_CONNECT Acest tip de eveniment specifică faptul că un client s-a conectat
la server
2. TCP_DISCONNECT Acest tip de eveniment specifică faptul că un client s-a
deconectat de la server
3. TCP_DATAREADY Acest tip de eveniment semnalizează faptul că s-au recepţionat
date de la client. Se va utiliza funcţia dedicată de citire a datelor
(a se vedea mai jos)

Pentru a determina ce tip de eveniment a generat autoapelul funcţiei de callback a


serverului, în interiorul funcţiei va trebui să se facă teste asupra variabilei xType, care menţine tipul
de eveniment.
În cazul in care xType este TCP_CONNECT, aplicaţia server trebuie să salveze
identificatorul comunicaţiei (variabila handle) într-o variabilă globală utilizată ulterior în
operaţiile de transmisie/citire a datelor la server. De asemenea, în urma procesului de conectare a
unui client, serverul poate prelua informaţii despre numele şi adresa de IP a clientului. Funcţiile
utilizate în acest caz sunt: GetTCPPeerAddr şi GetTCPPeerName.
În cazul in care xType este TCP_DISCONNECT, aplicaţia server poate actualiza o căsuţă de
stare a comunicaţiei cu clientul, semnalizând deconectarea acestuia.
În cazul in care xType este TCP_DATAREADY, aplicaţia server trebuie să preia datele
recepţionate de la client prin utilizarea funcţiilor specializate ale serverului (prezentate mai jos).
În urma procesului de înregistrare a serverului, aplicaţia server poate furniza utilizatorului
diverse informaţii ale acestui server, cum ar fi: numele serverului, adresa de IP, portul. Pentru
obţinerea acestor informaţii se pot utiliza funcţii de librarie, cum ar fi: GetTCPHostAddr,
GetTCPHostName.
Pentru a opri un server TCP/IP pecedent înregistrat se va folosi funcţia
UnregisterTCPServer.
Înafară de înregistrarea/oprirea unui server TCP/IP, orice aplicaţie server trebuie să permită
transmisia şi recepţia datelor. Recepţia datelor (operaţia de read) în cadrul unei aplicaţii server în
CVI se realizează prin utilizarea funcţiei de bibleotecă ServerTCPRead. Datorită faptului că
procesul de recepţie a datelor de partea serverului este un proces asincron faţă de starea aplicaţiei,
funcţia ServerTCPRead va trebui să se apelez în funcţia de callback a serverului, atunci când sunt
date disponibile de la client.
Transmiterea datelor de la server la client se realizează utilizând funcţia de bibleotecă
ServerTCPWrite. Această funcţie se poate apela ori de câte ori este necesară transmisia de date.
A se avea în vedere că această funcţie utilizează identificatorul de comunicaţie precedent salvat în
funcţia de callback a serverului.

5.3.2 Client TCP/IP

Pentru a putea conecta un client TCP dintr-o aplicaţie CVI la un server trebuiesc cunoscute
o serie de informaţii despre serverul la care se doreşte conectarea. Prima informaţie se referă la
numele serverului sau adresa lui de IP asociată acestui nume. Ca tehnică de proiectare a aplicaţiei se
recomandă folosirea numelui serverului (ca de exemplu: ”localhost”, ”S3302”) sau cererea acestuia
de la utilizator. Acest lucru se datorează faptului că adresa unui server se poate schimba dar numele
lui de obicei nu.

3
Achiziţia şi Prelucrarea Datelor____________________________________________Laborator 05
Mai este nevoie şi de numărul portului la care poate fi accesat respectivul serviciu în cadrul
serverului. Pe un singur PC pot fi acitve mai multe servere TCP, atâta timp cât porturile pe care s-au
înregistrat acele servere diferă. Din acest motiv, aplicaţia client va trebui să distingă din lista de
servere active un singur server de interes prin utilizarea portului corespunzător.
Înainte de orice operaţie de comunicare (transmisie/recepţie) clientul trebuie să se conecteze
la server, utilizând funcţia ConnectToTCPServer. Funcţia are următorul prototip:

int ConnectToTCPServer (unsigned int *conversationHandle, unsigned


int portNumber, char *serverHostName, tcpFuncPtr
clientCallbackFunction, void *callbackData, unsigned int timeout);

Descrierea parametrilor:
- conversationHandle: funcţia ConnectToTCPServer creează un canal de
comunicaţie cu serverul şi returnează un identificator al comunicaţiei în această
variabilă;
- portNumber: portul pe care este înregistrat serverul
- serverHostName: un şir de caractere care reprezintă numele serverului (ex:
”localhost”, ”S3302”) sau adresa de ip a acestuia (ex: ”192.168.247.90”);
- clientCallback function: funcţia de callback a clientului; va fi utilizată pentru
recepţionarea datelor de la server şi pentru depistarea deconectării serverului.
- callbackData: parametru de 4 octeţi transmişi de fiecare dată când se apelează funcţia
(de obicei se lasă 0);
- timeout: numărul de milisecunde care se aşteaptă pentru reapelul funcţiei în caz că
operaţia de conectare a eşuat
După cum s-a prezentat şi mai sus, funcţia de callback a clientului va fi utilizată pentru
recepţia datelor de la server şi pentru determinarea deconectării serverului. Prototipul şi parametrii
funcţiei sunt identici cu cei ai funcţiei de callback pentru server, aşadar nu vor mai fi prezentaţi în
acest subcapitol. Există o diferenţă totuşi faţă de evenimentele care pot genera autoapelul funcţiei
de callback: în cazul clientului, evenimentel pot fi doar două: TCP_DISCONNECT şi
TCP_DATAREADY. Mai jos se prezintă un tabel cu descrierea evenimentelor:

Nr. Crt. Eveniment (xType) Descriere


1. TCP_DISCONNECT Acest tip de eveniment specifică faptul că serverul s-a
deconectat
2. TCP_DATAREADY Acest tip de eveniment semnalizează faptul că s-au recepţionat
date de la server. Se va utiliza funcţia dedicată de citire a datelor
(a se vedea mai jos)

Ca şi în cazul aplicaţiei server, în urma procesului de conectare la server aplicaţia client


poate furniza utilizatorului diverse informaţii ale serverului, cum ar fi: numele serverului, adresa de
IP, portul. Pentru obţinerea acestor informaţii se pot utiliza funcţii de librărie, cum ar fi:
GetTCPPeerAddr şi GetTCPPeerName. De asemenea, după conectarea la server, aplicaţia client
poate furniza date cu privire la adresa şi numele clientului, utilizând funcţiile GetTCPHostAddr,
GetTCPHostName.
Pentru a opri un client TCP/IP precedent conectat la un server se poate utiliza funcţia de
librărie DisconnectFromTCPServer. Operaţiile de comunicaţie (transmisie/recepţie) ulterioare
deconectării de la server vor fi invalide (vor genera erori).
Comunicaţia cu serverul se realizează prin utilizarea funcţiilor de librărie
ClientTCPWrite (pentru transmisie) şi ClientTCPRead (recepţie). Dacă transmisia datelor se
poate face oriunde în aplicaţie, atunci când este nevoie, recepţia datelor de la server trebuie să fie
făcută în funcţia de callback a clientului, pe evenimentul TCP_DATAREADY.

4
Achiziţia şi Prelucrarea Datelor____________________________________________Laborator 05

5.3.3 Tratarea erorilor

Librăria TCP/IP din cadrul medului de programare Labwindows/CVI pune la dispoziţia


programatorului mecanisme de a trata erorile generate de apelurile funcţiilor TCP/IP. Una dintre
funcţiile care returnează informaţii detaliate cu privire la erorile apărute în urma apelului oricărei
funcţii de librărie TCP/IP este funcţia GetTCPSystemErrorString. În funcţie de codul de eroare
returnat la apelul unei funcţii TCP/IP, această funcţie decodifică valoarea erorii si va selecta unul
din mesajele de eroare corespunzător problemei apărute. Acest mesaj poate fi utilizat pentru a
înştiinţa utilizatorul despre eventualele probleme de comunicaţie.
O aplicaţie de tip server sau client corect proiectată trebuie să ţină seama de eventualele
erori care pot apărea în procesul de comunicaţie. De exemplu, dacă un client nu reuşeşte din varii
motive să se conecteze la un server, atunci operaţiile subsidiare ale aplicaţiei client trebuiesc
inactivate pentru a evita eventualele mesaje de sistem sau chiar funcţionarea inadecvată a aplicaţiei.

5
Achiziţia şi Prelucrarea Datelor____________________________________________Laborator 05

5.4 Teme
Să se realizeze o aplicaţie ce înlesneşte comunicaţia prin intermediul reţelei de calculatoare a
două dispozitive electronice care în mod obişnuit comunică prin intermediul unui cablu serial.
Aplicaţia trebuie să gestioneze o comunicaţie serială (deja implementat in tema propusă), sa
gestioneze evenimente utilizator (deja implementat în tema propusă) să creeze un server şi să
accepte un singur client sau să creeze un client şi să se conecteze la un server. Testarea aplicaţiei
presupune lansarea în execuţie a două aplicaţii Term95 pe două calculatoare diferite şi schimbul de
informaţii între acestea.

6
Achiziţia şi Prelucrarea Datelor____________________________________________Laborator 05

1. Creaţi un server
2. Definiţi funcţia de callback şi gestionaţi evenimentele. La un moment dat un sigur client
poate fi conectat la server.
3. Afişaţi în fereastra „Setări pentru comunicaţia TCP/IP” informaţii despre momentul
conectării, clientul conectat (nume, adresă), momentul deconectării, informaţiile transmise
şi recepţionate.
4. Conectaţi un client la un server.
5. Definiţi funcţia de callback şi gestionaţi evenimentele.
6. Afişaţi în fereastra „Setări pentru comunicaţia TCP/IP” informaţii despre momentul
conectării, serverul la care s-a conectat (nume, adresă), momentul deconectării (voite sau
forţate), informaţiile transmise şi recepţionate

Obs. se recomandă dezactivarea programului de tip firewall al sistemului de operare, care


ar putea împiedica aplicaţie client să se conecteze.

Você também pode gostar