Scrigroup - Documente si articole

     

HomeDocumenteUploadResurseAlte limbi doc
AccessAdobe photoshopAlgoritmiAutocadBaze de dateCC sharp
CalculatoareCorel drawDot netExcelFox proFrontpageHardware
HtmlInternetJavaLinuxMatlabMs dosPascal
PhpPower pointRetele calculatoareSqlTutorialsWebdesignWindows
WordXml


Comunicare prin socket-uri - UNIX

linux



+ Font mai mare | - Font mai mic



Comunicare prin socket-uri - UNIX



Modul in care pot comunica procesele care se executa pe masini diferite difera in functie de protocol si de mediul de transmisie. Mai mult, aceste metode nu pot permite comunicarea intre procese de pe aceeasi masina, deoarece ele presupun existenta unui proces server care se afla in asteptare in cadrul unui apel sistem open sau read, relativ la un driver. Pentru a furniza metode generale de comunicare intre procese si pentru a permite utilizarea protocoalelor de retea sofisticate, sistemul BSD pune la dispozitie un mecanism cunoscut sub numele de comunicare prin socket-uri. In acest subcapitol sunt descrise unele aspecte, la nivel utilizator, ale socket-urilor.

Structura acestui mecanism la nivelul nucleului, contine trei parti nivelul socket, nivelul protocol si nivelul dispozitiv (Figura 10.18). Nivelul socket furnizeaza interfata dintre apelurile sistem si nivelurile inferioare, nivelul protocol contine modulele de protocoale folosite pentru comunicatie (in figura, TCP si IP), iar nivelul dispozitiv contine driverele de care controleaza lucrul dispozitivelor de retea. La configurarea sistemului se precizeaza combinatiile de protocoale acceptate si driverele, metoda care nu este la fel de flexibila ca lucrul cu stream-uri. Procesele comunica dupa modelul client-server un proces server asculta la un socket, unul din capetele liniei bidirectionale de comunicatii, iar procesul client comunica cu serverul prin alt socket, adica celalalt capat al liniei, care poate fi pe o alta masina. Nucleul pastreaza conexiunile interne si directioneaza datele de la client catre server.

Figura 10.18. Modelul comunicarii prin socket-uri

Socket-urile care au aceleasi proprietati de comunicatie, cum ar fi conventiile de nume si formatele de adresa, sunt grupate in domenii. Sistemul BSD 4.2 suporta domeniul UNIX de comunicare intre procesele de pe aceeasi masina, si domeniul Internet de comunicare intre procese de pe masini diferite prin retea utilizand protocoalele de comunicatie DARPA(Defense Advanced Research Project Agency). Fiecare socket are un tip, si anume circuit virtual (stream socket, in terminologia Berkeley) sau datagrama. Un circuit virtual permite accesul secvential si functionarea corecta a datelor. Datagramele nu garanteaza accesul secvential la date si integritatea acestora, in schimb sunt mai putin costisitoare decat circuitele virtuale, pentru ca nu necesita operatiuni de initializare deosebite prin urmare ele sunt utile pentru anumite tipuri de comunicari. Sistemul contine un protocol implicit pentru fiecare combinatie acceptata de tip domeniu-socket. De exemplu, protocolul TCP (Transport Connect Protocol) furnizeaza serviciul de circuit virtual, iar protocolul UDP (User Datagram Protocol) furnizeaza serviciul de datagrame, in domeniul Internet.

Mecanismul de comunicare prin socket-uri contine cateva apeluri sistem. Apelul sistem socket stabileste punctul final al unei legaturi de comunicatie.

sd = socket(format, type, protocol);

unde parametrul format precizeaza domeniul de comunicatie (domeniul UNIX, sau domeniul Internet), type indica tipul de comunicatie prin socket (circuit virtual, sau datagrama), iar protocol precizeaza un anumit protocol pentru controlul comunicatiei. In cadrul altor apeluri sistem, procesele vor intrebuinta descriptorul de socket, sd. Apelul sistem close inchide socket-urile.

Apelul sistem bind asociaza un nume descriptorului de socket

bind(sd, address, length)

unde sd este descriptorul de socket, iar address este adresa unei structuri care precizeaza un indicator al domeniului si protocolului de comunicatie, precizate in cadrul apelului sistem socket. Parametrul length reprezinta lungimea structurii de date address fara acest parametru nucleul nu ar sti cat de lunga este adresa, deoarece lungimea acesteia poate diferi de la un domeniu (sau protocol) la altul. De exemplu, in cadrul domeniului UNIX, o adresa este un nume de fisier. Procesul server ataseaza adresele din apelul bind unor socket-uri si ²face publice² numele lor pentru a fi identificate de catre procesele client.

Apelul sistem connect cere nucleului sa faca o conexiune cu un socket existent

connect(sd, address, length)

unde semnificatia parametrilor este aceeasi ca la apelul bind, cu deosebirea ca parametrul address reprezinta adresa socket-ului destinatie care va constitui celalalt capat al liniei de comunicatie. Ambele socket-uri trebuie sa foloseasca acelasi domeniu si protocol de comunicatie, ramanand in sarcina nucleului initializarea corecta a legaturilor de comunicatie. Daca tipul socket-ului este datagrama, atunci apelul connect informeaza nucleul asupra adresei de utilizat in cadrul apelurilor send ulterioare prin socket-ul respectiv in momentul apelului nu se realizeaza nici o legatura.

Atunci cand un proces server accepta legaturile printr-un circuit virtual, nucleul trebuie sa puna intr-o coada de asteptare cererile care sosesc, pana in momentul in care va putea sa le satisfaca. Apelul sistem listen precizeaza lungimea maxima a cozii de asteptare

listen(sd, qlength)

unde sd este descriptorul de socket si qlength reprezinta numarul maxim de cereri care vor fi luate in consideratie.

Figura 10.19. Acceptarea unui apel de catre un proces server

Apelul sistem accept primeste cererile de conectare la un proces server

nsd = accept(sd, address, addrlen)

unde sd este descriptorul de socket, address indica o zona de date utilizator pe care nucleul o completeaza cu adresa de retur a procesului client care se conecteaza, iar addrlen precizeaza dimensiunea acestei zone. La revenirea din apelul accept, nucleul scrie in addrlen un numar care semnifica dimensiunea spatiului ocupat in zona de date. Apelul accept intoarce un nou descriptor de socket, nsd, diferit de descriptorul sd. Un proces server poate continua sa asculte la socket-ul anuntat, in timp ce comunica cu un proces client pe un canal separat de comunicatie (Figura 10.19).

Apelurile sistem send si recv permit transferul datelor printr-un socket. Sintaxa apelului sistem send este

count = send(sd, msg, length, flags)

unde   sd este descriptorul de socket, msg este un pointer catre datele care urmeaza sa fie transmise, length reprezinta lungimea datelor de transmis, iar count este numarul de octeti efectiv transmisi. Parametrului flags i se poate atribui valoarea SOFIOOB pentru a realiza o transmitere ²out-of-band² a unor date, intelegand prin aceasta ca datele trimise nu fac parte din schimbul obisnuit de date intre procesele care comunica. De exemplu, un program de deschidere de sesiune la distanta poate trimite un mesaj ²out-of-band² pentru a simula apasarea tastei Del de catre un utilizator, la un terminal. Sintaxa apelului sistem recv este

count = recv(sd, buf, length, flags)

unde buf este locul unde se memoreaza datele care sosesc, length este lungimea asteptata a datelor, iar count este numarul de octeti efectiv copiati in programul utilizatorului. Parametrul flags poate primi valoarea ²peek², pentru un mesaj care soseste, in scopul examinarii continutului sau fara a-l scoate din coada de asteptare, sau valoarea ²out-of-band² pentru cazul explicat mai sus. Versiunile pentru datagrame ale acestor apeluri sistem, sendto si recvfrom, au in plus parametri pentru adrese. Procesele pot utiliza apelurile sistem read si write in cazul circuitelor virtuale, in locul apelurilor send si recv, dupa initializarea legaturii. Astfel, procesele server se pot ingriji de negocierea protocoalelor de retea si de crearea proceselor care utilizeaza numai apeluri sistem read si write, ca si cand acestea ar lucra cu fisiere obisnuite.

Apelul sistem shutdown inchide o conexiune cu un socket

shutdown(sd, mode)

unde mode indica daca partea care trimite datele, partea care le receptioneaza, sau ambele parti incheie transmisia datelor. Acest apel informeaza protocoalele de nivel inferior sa incheie comunicarea prin retea, insa cu mentinerea intacta a descriptorilor de socket-uri. Apelul sistem close elibereaza si descriptorul de socket.

Apelul sistem getsockname furnizeaza numele asociat unui socket, printr-un apel bind anterior

getsockname(sd, name, length)

Apelurile getsockopt si setsockopt obtin si respectiv seteaza diferite optiuni asociate socket-ului, in concordanta cu domeniul si protocolul de comunicatie prin socket.

Sa consideram programul server din figura 10.20. Procesul creeaza un circuit virtuak in cadrul domeniului UNIX si printr-un apel bind ii asociaza numele sockname. Apoi invoca apelul sistem listen, pentru a preciza lungimea cozii de asteptare pentru mesajele care sosesc si intra intr-o bucla, asteptand cererile care sosesc.

Apelul accept asteapta pana cand protocolul de nivel inferior notifica sosirea unei cereri de legatura prin socket-ul care are numele respectiv apoi, apelul accept intoarce un nou descriptor pentru cererea care soseste.

Procesul server creeaza un proces care sa comunice cu procesul client procesele parinte si fiu isi inchid descriptorii initiali pentru a evita interferarea cu comunicarile celorlalte procese. Procesul fiu isi continua dialogul cu procesul client, incheindu-si executia (in acest exemplu) dupa apelul read. Procesul server reintra in bucla si asteapta o alta cerere de legatura, in cadrul apelului accept.

#include <sys/types.h>

#include <sys/socket.h>

main()

close(ns);

}

Figura 10.20. Un proces server din cadrul domeniului UNIX

Figura 10.21 prezinta procesul client corespunzator procesului server. Procesul creeaza un socket in acelasi domeniu ca si serverul si emite o cerere connect pentru numele sockname, asociat unui socket anume de catre procesul server. La iesirea din apelul connect, procesul client dispune de un circuit virtual catre un proces server. In acest exemplu, procesul client scrie un singur mesaj si isi incheie executia. Daca procesul server furnizeaza servicii proceselor dintr-o retea, atunci in cadrul apelurilor sale sistem se specifica faptul ca socket-ul apartine domeniului Internet, prin

socket(AFIINET, SOCKISTREAM, 0)

si i se asociaza o adresa de retea obtinuta dintr-un nume de server. Sistemul BSD dispune de apeluri de biblioteca, care indeplinesc aceste functii.

#include <sys/types.h>

#include<sys/socket.h>

main()

Figura 10.21 Un proces client din cadrul domeniului UNIX

Similar, al doilea parametru al apelului connect facut de procesul client, trebuie sa contina informatia de adresa necesara identificarii masinii in retea (sau adresa de rutare pentru transmiterea mesajelor la masina de destinatie, prin masini intermediare), precum si informatii suplimentare de identificare a unui anumit socket de pe masina de destinatie. Daca procesul server doreste sa asculte atat in retea, cat si la procesele locale, el trebuie sa foloseasca doua socket-uri si apelul sistem select pentru a determina care din procesele client se conecteaza.



Politica de confidentialitate | Termeni si conditii de utilizare



DISTRIBUIE DOCUMENTUL

Comentarii


Vizualizari: 1428
Importanta: rank

Comenteaza documentul:

Te rugam sa te autentifici sau sa iti faci cont pentru a putea comenta

Creaza cont nou

Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved