Você está na página 1de 9

Lucrarea 4 Aplicatii Socket Datagram

1. Ce este socket?
Un socket este un capt de comunicaie sau punct final de comunicaie care poate fi numit i adresat ntr-o reea, fiind locul unde programul de aplicaie se ntlnete cu furnizorul mediului de transport. Un soket este: - d.p.d.v. al unui program de aplicaie: o resurs alocat de sistemul de operare; - d.p.d.v. al sistemului de operare: o structur de date ntreinut de ctre nucleul sistemului de operare; aceast structur este referit n aplicaii printr-un ntreg numit descriptor de socket. Relativ la un socket se pot face una dintre urmtoarele dou analogii: - socket-cutie potal: o proprietarul (aplicaia) depune mesajele de trimis i i ridic corespondena primit; o facorul potal (furnizorul mediului de transport) deschide cutia de cteva ori pe zi, ridic corespondana de expediat i depune corespondena sosit la adresa respectiv; - socket-aparat telefonic: o proprietarul formeaz un numr i dup stabilirea legturii ncepe s discute cu persoana de la cellalt capt al firului; o aparatul i ntreaga reea telefonic asigur stabilitatea legturii pn la ncheierea convorbirii . OBS. dou aplicaii pot comunica ntre ele prin socket doar dup ce fiecreia dintre ele sistemul de operare i-a alocat un socket (exist un numr de descriptori de socket rezervai pentru aplicaiile de sistem, restul descriptorilor fiind disponibili pentru utilizatori).

2. Tipuri de socket
D.p.d.v. al transportului efectuat se disting dou tipuri de socket: socket stream i socket datagram. Comunicarea este posibil, doar dac la ambele capete este utilizat acelai tip de socket. 2.1. Socket stream Interfaa socket stream definete un serviciu orientat conexiune, datele fiind transmise fr erori i fr duplicri, Datele sunt recepionate n aceeai ordine n care au fost transmise, avndu-se grij ns ca fluxul de date s nu depeasc o valoare maxim de octei la un moment dat. Asupra datelor ce sunt transmise nu se impune nici un fel de limitare, ele fiind considerate simple iruri de octei. Transportul este realizat folosind protocolul TCP. Fiind un serviciu orientat conexiune, este potrivit analogia fcut anterior cu aparatul telefonic. Ca exemplu de utilizare pentru socket stream poate fi dat unul dintre serviciile nivelului aplicaie, i anume FTP (File Transfer Protocol). Deci, socket stream asigur o conexiune sigur, lucru care presupune ns reducerea performanei datorit efortului de calcul necesar meninerii conexiunii i verificrilor de corectitudine. La nivel utilizator aceast reducere a performanei nu este ns sesizat . Se recomand utilizarea socket-ului stream n cazurile n care cantitile de date ce sunt transmise sunt mari, iar comunicaia are loc n reele WAN. 2.2. Socket datagram Interfaa socket datagram definete un serviciu fr conexiune n care datagramele sunt transmise ca i pachete separate. Serviciul nu asigur garanii cu privire la recepionarea datelor, acestea putnd fi pierdute ori duplicate, ordinea de sosire la destinaie putnd fi de asemenea diferit de cea de transmitere. Mrimea unei datagrame este limitat la numrul de octei care pot fi transmii ntr-o singur tranzacie. Transportul este realizat folosind protocolul UDP, iar analogia potrivit este cea cu cutia potal. Comunicarea prin socket-ul datagram este nesigur deoarece pachetele pot fi ignorate, alterate sau duplicate n timpul transmisiei,

utilizarea lui fiind recomandat n cazurile n care aplicaia implementeaz un mecanism propriu de corectitudine sau dac aplicaia nu este sensibil la transmisii eronate. Se ctig ns vitez la prelucrare raportat la socket-ul stream. Se recomand folosirea acestui tip de socket pentru transmiterea unei cantiti mici de date n cadrul reelelor LAN.

3. Adrese socket
Pentru a fi independent de platform, socket permite utilizarea mai multor familii de adrese, o astfel de familie definind un stil de adresare. Toate host-urile din aceeai familie de adrese neleg i folosesc aceeai schem pentru adresarea capetelor socket-ului. Familiile de adrese sunt identificate printr-un numr ntreg, numele acestora ncepnd cu AF (Adress Family): - AF_INET: definete adresarea n domeniul Internet, fiind i cea mai important familie; - AF_UNIX: reprezint sistemul local (protocoale interne UNIX); - AF_NS: pentru protocoale Xerox NS; - AF_IMPLINK: pentru IMP(Interface Message Processor). Generic, stuctura unei adrese este urmtoarea:
struct sockaddr{ u_short sa_family; //valoare AF_xxx char sa_data[14]; //dependent de familie }

unde, sa_family: indic familia de adrese folosit; sa_data: interpretat n funcie de familie. OBS. fiecare familie de adrese are definit structura proprie de adres care se suprapune peste cea generic n momentul transmiterii ei ctre nucleu. Adresele din familia AF_INET sunt de tip struct sockaddr_in i sunt definite n <Winsock2.h> astfel:
struct in_addr { union { struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b; struct { u_short s_w1,s_w2; } S_un_w; u_long S_addr;

} S_un; }; struct sockadrr_in{ short sin_family; u_short sin_port; struct in_addr sin_addr; char in_zero[8]; }

//valoare AF_INET //numarul de port //adresa IP //nefolosit

4. Scheme de implementri client/server


Aplicaiile care folosesc socket respect o serie de scenarii bine stabilite: este vorba despre ordinea de apelare a funciilor sistem n funcie de tipul de socket i de rolul pe care l joac aplicaia (client sau server) 4.1. Scenariul aplicaiilor socket datagram Succesiunea apelurilor pentru client i server este dup cum urmeaz:
SERVER

socket
CLIENT

bind recvfrom
Date pentru cerere

socket sendto

Actiunile necesare servirii cererii

sendto

Date de raspuns

recvfrom

closesocket

closesocket

Fig. 10. Apelurile sistem pentru aplicatiile datagram

Att serverul ct i clientul au cte o parte de iniializare dup care urmeaz transferul de date i apoi nchiderea descriptorilor socket.. Partea de iniializare pentru server socket: cere nucleului sistemului s creeze un socket prin care s poat fi contactat de ctre clieni; se fixeaz familia de adrese folosit i tipul de socket (n acest caz datagram) ; bind: transmite nucleului numrul de port la care serverul ateapt s fie contactat precum i faptul c poate fi contactat prin orice interfa de reea de pe maina server;

Partea de iniializare pentru client socket: cere nucleului sistemului s creeze un socket prin care s poat fi contactat; se fixeaz familia de adrese folosit i tipul de socket (n acest caz datagram) ;

Relaia curent ntre un client i un server dupa initializare serverul ramane in asteptarea unui pachet de date. clientul execut un apel sistem sendto prin care transmite serverului un mesaj prin care i se cere un serviciu; serverul prin apelul sistem recvfrom recepioneaz acest mesaj; serverul execut aciunile necesare satisfacerii cererii clientului

OBS.

Biblioteca Winsock2 ofera si o alta posibilitate de scriere a aplicatiei client. Concret, aplicatia client poate fi scrisa exact ca in cazul socket stream, singura diferenta fiind valoarea parametrului al doi-lea al functiei socket (se va folosi SOCK_DGRAM in loc de SOCK_STREAM)

SERVER

CLIENT iniializare nchidere conexiune transfer de date socket

connect

cerere

send

rspuns

recv

closesocket

Fig. 11. Apelurile sistem pentru aplicaia client (winsock2) Apelul connect, n acest caz, nu realizeaz o conexiune, ci doar salveaz datele serverului n memorie. Acestea sunt folosite atunci cnd se va apela send sau recv.

5. Apeluri sistem socket


Aceste apeluri sistem trebuie precedate de specificarea fiierului header: #include <winsock2.h> 5.1. Initializarea bibliotecii winsock2 Inaintea folosirii metodelor aferente socket, biblioteca winsock2 trebuie initializata, Pentru aceasta trebuie apelata metoda: int WSAStartup( WORD wVersionRequested,

LPWSADATA lpWSAData ); unde: wVersionRequested versiunea bibliotecii socket folosita (byte-ul superior indica revizia iar byte-ul inferior versiunea. Vom utiliza versiunea 2 si revizia 2 0x0202) lpWSAData pointer la o structure de tip WSADATA La finalul aplicatiei trebuie apelata metoda WSACleanup() 5.2. Apelurile soket si bind Prototipurile apelurilor sunt: SOCKET socket (int familie, int tip, int protocol); unde: familie: indic familia de adres socket utilizat (AF_INET, AF_UNIX, etc); tip: indic tipul de socket folosit (SOCK_STREAM, SOCK_DGRAM); protocol: argument care are valoare 0 cu specificaia lsm sistemului alegerea protocolului Apelul creaz un socket care va asigura conectivitatea programului local, fie el client sau server. Apelul ntoarce un ntreg, notat n cele ce urmeaz cu sd i care reprezint descriptorul de socket (folosit de apelurile care urmeaz ca i parametru). sd se mai numete i socket(descriptor) de ntlnire. int bind (SOCKET sd, struct sockaddr *local, int lunglocal); //returneaza 0 la succes si -1 la eroare Server-ul i nregistreaz adresa socket proprie local, pentru socket-ul sd; lungimea adresei local este lunglocal. n local se trece numrul de port la care poate fi contactat, tot n local n cmpul sin_addr.s_addr se trece adresa IP a serverului sau constanta INADDR_ANY.

5.3. Apelurile sendto, recvfrom (operaii de I/O prin socket) Aceste apeluri sunt cele mai simple apeluri sistem prin intermediul crora se pot face schimburi de date ntre client i server prin socket. Utilizarea lor presupune citarea fiierului header: <winsock2.h> Sintaxele apelurilor sunt: int sendto ( SOCKET sd, const char *T, int n, int f, const struct sockaddr *to, int tolen); //returneaza numarul de octeti transmisi sau -1 la eroare unde: sd descriptorul de socket prin care se transmit datele; T adresa sirului de octeti care va fi trimis catre destinatie; n numarul de octeti care vor fi trimisi catre destinatie; f - flag care are de regul valoarea 0 lsnd n seama sistemului fixarea unor flaguri; to datele de identificare ale socketului destinatie (adresa IP si portul) tolen dimensiunea (in octeti) a structurii to

int recvfrom ( SOCKET sd, const char *T, int n, int f, const struct sockaddr *from, int *fromlen); //returneaza numarul de octeti primiti sau -1 la eroare

unde: sd descriptorul de socket prin care se primesc datele; T adresa zonei de memorie unde vor fi salvate datele; n dimensiunea, in octeti, a zonei de memorie; f - flag care are de regul valoarea 0 lsnd n seama sistemului fixarea unor flaguri; from structura in care vor fi salvate datele de identificare ale socket-ului care a trimis datele fromlen pointer catre un intreg in care se scrie dimensiunea (in octeti) a structurii from Apelul sendto expediaz prin sd, un numr de maxim n octei pe care i ia din memorie ncepnd cu adresa T. Responsabilitatea depunerii octeilor la aceast adres T revine programatorului. Apelul recvfrom recepioneaz prin sd un numr de maxim n octei pe care i depune n memorie ncepnd cu adresa T. Programatorul trebuie s se asigure c zona tampon are rezervai la adresa T cel puin n octei. OBS. Tratarea situaiilor n care nu s-au transmis sau recepionat exact cei n octei solicitai cade exclusiv n sarcina programatorului. Dac prin socket se poate transmite fie i numai 1 octet, acesta se va transmite i operaia este considerat ncheiat.

8. Cerinte laborator
a. Folosind functiile socket, bind, sendto si recvfrom scrieti o aplicatie client si o aplicatie server (aplicatii de tip consola). Clientul trebuie sa-i trimita un text serverului si apoi sa astepte raspunsul acestuia si sa-l afiseze pe ecran. Serverul trebuie sa astepte un text de la client pe care sa-l aiseze pe ecran si apoi sa-l trimita inapoi clientului. Serverul va asculta pe adresa 0.0.0.0 (sau 127.0.0.1) si pe un port inalt (peste 1024). b. Modificati aplicatiile client si server de la lucrarea anterioara astfel incat, in functie de valoarea unui parametru din linia de comanda, sa se realizeze transferul de date folosind atat socket stream cat si socket datagram.

Você também pode gostar