Sunteți pe pagina 1din 8

8.2.3. Socket-uri Conceptul de socket (soclu) i de programare a socket-urilor a aprut n 1980 n mediul UNIX, ca Berkeley Sockets Interface.

n esen, un socket permite comunicarea dintre procesele client i sever, i poate fi orientat sau neorientat pe conexiune. Socket-ul poate fi considerat ca punctul final al comunicaiei. Un socket client de pe un calculator folosete o adres pentru a apela socket-ul server de pe alt calculator. Odat ce au fost angajate cele dou socket-uri, pot fi schimbate date ntre cele dou calculatoare. Tipic, calculatorul cu socket-ul server menine un port TCP sau UDP deschis, pregtit pentru sosirea unor apeluri neplanificate. Tipic, clientul determin identitatea socket-ului server dorit, gsindu-l n baza de date DNS. Odat conexiunea realizat, serverul comut dialogul la diferite numere de port, pentru a elibera numrul principal de port, pentru apelurile suplimentare care vor sosi. Aplicaiile Internet, ca TELNET i remote login (rlogin) folosesc socket-uri, cu detalii ascunse utilizatorului. Dar socket-urile pot fi construite n program (n limbaje ca C sau Java), permind programatorului o implementare facil a funciilor de reea i a aplicaiilor. Interfaa Berkley pentru socket-uri (Berkeley Sockets Interface) este standardul de facto pentru interfeele API (Application Programming Interface), care acoper o gam mare de sisteme de operare. Socket-urile Window (WinSock) se bazeaz pe specificaiile Berkeley. Socket-urile API ofer accesul generic pentru serviciile de comunicare ntre procese. Antetul TCP i UDP include cmpurile pentru portul surs i portul destinaie. Aceste valori de port identific utilizatorii sauaplicaiile respective, ale celor dou entiti TCP. Att IPv4 ct i IPv6 au n antet cmpuri pentru adresa surs i adresa destinaie: adresele IP identific sistemele de pe hosturile respective. Prin concatenarea valorii portului i adresei IP se formeaz socket-ul care este unic n Internet. Socket-urile servesc la definirea interfeei API, care este o interfa generic de comunicaie, pentru scrierea programelor care folosesc TCP sau UDP. Cnd este folosit ca API, socket-ul este identificat prin (protocol, adresalocal, procesul-local). protocol (TCP sau UDP); adresa local (adresa IP), procesul local (numrul de port).

Deoarece numerele de porturi sunt unice n sistem, ele implic de fapt i protocolul, TCP sau UDP, dar pentru claritatea i uurina implementrii, socket-urile folosite pentru API includ i protocolul i adresa IP i numrul de port. Socket-urile API recunosc dou tipuri de socket-uri, corespunztoare celor dou tipuri de protocoale: steam socket (pentru TCP), orientate pe flux, folosesc TCP-ul care ofer un transfer de date sigur, orientat pe conexiune. Astfel, cu aceste socketuri, toate blocurile de date trimise ntre o pereche de socket-uri au garantat livrarea i sosesc n ordinea n care au fost transmise. datagram socket (pentru UDP), nu garanteaz nici livrarea, nici meninerea ordinii blocurilor la livrare. raw socket este al treilea tip de socket API, care permite accesul direct la protocoalele inferioare, ca IP sau ICMP.

Apelurile ale interfaei socket-ului 1.Crearea socket-ului, iniializare socket: primul pas la folosirea socketurilor este crearea unui socket nou, folosind comanda socket ( ) care are 3 parametri:

- familia de protocoale (care este ntotdeauna PF-INET pentru suita TCP/IP) - tipul (specific dac este un socket orientat pe flux sau datagram,); - protocol (TCP sau UDP).
Exist i tipul i protocolul ca s se permit n viitor folosirea i a altor protocoale de transport, altele dect TCP sau UDP. Comanda socket ( ) returneaz un ntreg, care identific socket-ul (este similar cu descriptorul de fiiere din Unix). Structura de date exact a socket-ului depinde de implementare. Ea include, pe lng portul surs i adresa, starea conexiunii, i pentru o conexiune deschis sau nerezolvat (open/pending), portul destinaie, adresa IP i alte opiuni i parametri asociai conexiunii. Dup ce socketul a fost creat trebuie s aib o adres pentru ascultare. Funcia bind ( ) asociaz socket-ului o adres de socket. 2. Conectarea soclului. Pentru un socket orientat pe flux, dup crearea socket-ului, poate fi stabilit o conexiune cu socket-ul de la distan. O parte funcioneaz ca i client i cere o conexiune celeilalte pri, care acioneaz ca server.

8.2. Aplicaii moderne 3

Stabilirea conexiunii pe partea serverului implic doi pai: mai nti aplicaia server genereaz listen ( ) prin care arat c socket-ul este pregtit s accepte conexiunea de intrare. Parametrul backlog indic numrul de conexiuni permise n coada de la intrare. Fiecare conexiune de intrare este plasat n aceast coad, pn este generat comanda accept ( ) pe partea serverului. apoi este folosit apelul accept ( ) pentru a extrage o cerere din coad. Dac aceasta este vid, apelul accept () blocheaz procesul pn sosete o cerere de conexiune. Dac nu este vid coada, exist un apel n ateptare i atunci accept () va returna un descriptor de fiier nou pentru conexiune. Acest lucru creaz un socket nou, care are adresa IP i numrul portului prii de la distan, adresa IP a acestui sistem i noul numr de port. Se asignez un socket nou cu un numr nou de port, pentru a i se permite aplicaiei locale s asculte pentru mai multe cereri. Astfel, o aplicaie poate avea mai multe conexiuni active simultan, fiecare cu un numr de port local diferit. Acest numr nou de port este returnat, prin conexiunea TCP, sistemului apelant.

Aplicaia client genereaz comanda connect ( ) specificnd socket-ul local i adresa socket-ului ndeprtat. Dac ncercarea de conectare eueaz, connect () returneaz valoarea -1. Dac ncercarea a avut succes, returneaz valoarea 0 i ncarc, n parametrii descriptorului de fiiere, adresa IP i numrul de port a socketului local i strin. Numrul de port ndeprtat poate diferi de cel specificat n parametrul (foreingAddress), deoarece numrul de port este schimbat pe hostul ndeprtat.

socket ()

Deschide punctul final al comunicaiei Inregistrare adres n sistem Stabilire conexiune client; cerere dimensiune coad Acceptare prima conexiune client; cerere coad

bind ()

listen ()

accept ()

Blocare pn la cerere de conectare client

socket ()

Punct de comunicaie deschis

accept() creaz un socket nou pe server pentru noua cerere client receive

connect ()

Stabilire comunicaie cu server Trimite/primete date

send ()

Proceseaz cererea Trimite/primete date

send ()

receive ()

close ()

close ()

nchidere conexiune

Fig.8. 14. Apel sistem la socket pentru un protocol orientat pe conexiune

8.2. Aplicaii moderne 5

Dup stabilirea conexiunii, se poate folosi comanda getpeername ( ), cine se afl pe cealalt parte a socket-ului conectat, orientat pe flux. Se returneaz o valoare n parametrul sockfd. 3. Comunicarea ntre socketuri Pentru comunicarea orientat pe flux se folosesc funciile send ( ) respectiv recv ( ), pentru emisia respectiv recepia datelor prin conexiunea identificat de parametru sockfd. n apelul send (), parametrul *msg indic blocul de date emis i len indic numrul de octei ce trebuie transmii. Parametrul flags conine indicatori de control, pui de obicei pe 0. Apelul send () returneaz numrul octeilor trimii, care poate fi mai mic dect len. n apelul recv (), parametrul *buf indic bufferul pentru memorarea datelor sosite, cu valoarea maxim dat de parametrul len. n orice moment, oricare din pri poate ncheia conexiunea cu apelul close ( ) care oprete emisiile sau recepiile viitoare. Apelul shutdown ( ) permit apelantului s termine emisia sau recepia sau ambele (figura 8.13). Pentru comunicaia datagram se folosesc funciile sendto ( ) i recvfrom ( ). Apelul sendto () are aceeai parametri ca apelul send () i n plus o specificare a adresei destinaie (adres IP i port). i apelul recvfrom () include parametrii de adres care sunt ncrcai cnd se recepioneaz date. Alte apeluri sistem Cu apelurile getsockopt ( ) i setsockopt ( ) utilizatorul poate citi i modifica opiunile socketul-ui. Apelurile gethostbyname () i gethostname () sunt foarte importante. Pentru stabilirea conexiunii cu hostul ndeprtat sau trimiterea unei datagrame acestuia trebuie cunoscute adresa IP i numrul de port al lui. Dar de obicei aplicaia tie doar numele domeniului hostului ndeprtat. Cu gethostname () se returneaz adresa acestuia, dar mai trebuie cunoscut adresa local. Dac aceast informaie nu este configurat n aplicaie, implementarea socket-ului local poate obine informaia n doi pai: mai nti aplicaia genereaz un apel gethostname () care retuneaz numele sistemului, apoi se gsete adresa local cu apelul gethostbyname () care folosete numele local.

Funciile unui socket Crearea socket-ului int sockfd = socket (int protocolFamily, int type, Int protocol), creaz un socket TCP sau UDP; dac nu este eroare returneaz descriptorul socket-ului, dac este eroare returneaz -1; int bind (int sockfd, struct sockaddr * localAddress, int addrlen), asigneaz adresele locale IP i porturile pentru socket; Conectarea socket-ului int listen (int sockfd, int backlog), arat dac socket-ul n cauz este gata de a accepta o nou conexiune, unde backlog indic numrul de cereri de conexiune care pot fi memorate n coad, ct timp procesul nu a generat nc acceptarea apelului; int sockfd= accept (int sockfd, struct sockaddr*client Address, int*addrlen), accept primul apel din coada de ateptare; dac aceasta este vid, procesul este blocat, n ateptarea unui apel; int connect (int sockfd, struct sockaddr*foreignAddress, int addrlen), stabilete conexiunea ntre socket-ul local i cel de la distan, asociat prin sockaddr; int getpeername (int sockfd, struct sockaddr*foreignAddress, int*addrlen), returneaz socket-ului informaia de la distan (de la cellalt capt al conexiunii), ntr-o structur sockaddr; Comunicarea prin socket int send (int sockfd, const void*msg,int len, int flags), transmite prin socket-ul dat octeii din buffer, indicai prin *msg; int recv (int sockfd, void*buf, int len, unsigned int flags), copiaz un numr de bii specificat, receptionai de socket, ntr-o locaie specificat; close (sockfd), incheierea conexiunii prin socket; nu mai sunt transmisii sau recepii ulterioare; int shutdown (int sockfd, int how), ncheierea conexiunii prin socket; al doilea parametru indic dac nu va fi permis emisia, sau recepia, sau ambele; int sendto (int sockfd const void*msg, int flags, const struct destAddr*to, int destAddrLen), transmite octeii n stil datagram, ntre socket-urile specificate;

8.2. Aplicaii moderne 7

int recvfrom (int sockfd, void * buf, int len, unsigned int flags, struct sockaddr* fromAddr, int* fromAddrLen), recepioneaz octeii n stil datagram; Controlul socket-ului int getsockopt (int sockfd, level, int optName, void*optVal), regsirea opiunii socket-ului; int setsockopt (int sockfd, in level, int optName, void*optVal, unsigned int optLen), stabilete opiunile pentru socket; Informaii despre host i serviciu int gethostname (char*hostname, unsigned int length), returneaz numele hostului local; struct hostent*gethostbyname (const char*hostname), returneaz o structur hostent, care conine o descriere a hostului numit, incluznd adresa hostului; struct hostent*gethostbyaddr (const*address, int addrlen, int addressFamily), avnd o adres IP dat, returneaz o structur hostend care conine descrierea i adresa hostului; struct servent*getservbyname (const char*serviceName, const char*protocol), avnd dat numele serviciului (ecoul, de exemplu) i protocolul care suport acel serviciu, returneaz o structur servent pentru acel host; struct servent*getservbyport( int port, const char*protocol), avnd date portul i protocolul de serviciu, returneaz o structur servent pentru acel serviciu.

MIME

SDP

Media

Nivelul Aplicatie

TEL NET

FTP

SMTP

HTTP

BGP

TLS

SIP RTP

DNS

SNMP Nivelul Transport

TCP

UDP

Nivelul Internet ICMP IGMP OSPF RSVP

IP

BGP = Border Gateway Protocol; DNS = Domain Name System; FTP = File Transfer Protocol; HTTP= Hypertext Transfer Protocol; ICMP= Internet Control Message Protocol IGMP= Internet Group Manag. Protocol

RSVP= Resources Reservation Protocol RTP=Real-Time Transport Protocol SDP= Session Description Protocol SIP= Session Description Protocol SMTP=Session Initiation Protocol SNMP=Simple Network Manag. Protocol IP = Internet Protocol; TCP=Transport Control Protocol MIME =Multi-Purpose Internet Mail Extension TLS =Transport Layer Security OSPF = Open Shortest Path UDP= User Datagram Protocol Fig. 8.15 Protocoale din stiva de protocoale TCP/IP

S-ar putea să vă placă și