Sunteți pe pagina 1din 11

1 Introducere 1.1 Noiunea de socket n reelele de calculatoare: Socket un conector abstract prin care un proces transmite i primete date.

. Socket-ul este o noiune abstract prin care se exprim o privire simplificat asupra modului de funcionare a reelelor de calculatoare n baza protocolului TCP. Dac considerm c IP adresa reprezint calculatorul la care ruleaz un program care efectuiaz schimb de date prin reea, iar portul reprezint nsi acest program, atunci socket-ul este punctul virtual n care aceast aplicaie este conectat la canalul reelei prin intermediul calculatorului. Utiliznd socket-urile aplicaiile rulate la un calculator paote, n cadrul aceleiai aplicaii, s efectueze mai multe aciuni simultan utiliznd acelai IP i port. n acest caz vor fi create socket-uri separate pentru fiecare conexiune de transmitere a datelor, att ntr-o direcie ct i n alta. Figura_1

Figura_1 : Reprezint o privire general asupra modului de funcionare a reelei la nivel de socket-uri.

Reprezint socket-urile prin care o aplicaie rulat pe server este conectat la aplicaii rulate pe clieneni. 2. Utilizarea Socket-urilor. n cele ce urmeaz este descris modul de creare i funcionare a unei aplicaii ClientServer programat la nivel de socket. Etapele de elaborare a aplicaiei creatre n cadrul acestei lucrri de laborator sunt deasemenea descrise mai jos. 2.1. Crearea unui socket: Din punctul de vedere al aplicaiilor, socket-ul nu este doar o combinaie dintre adresa IP

i numrul portului, ci o structur de date care conine parametrii canalului virtual de comunicaie. La crearea unui socket programatorul sau aplicaia terebuie s specifice: I. II. Tipul formatelor de adres care vor fi necesare n timpul utilizrii socket-ului; Tipul serviciului de comunicare: a) Flux comunicare orientat pe conexiune; b) Datagram comunicare neorientat pe conexiune. III. Protocolul utilizat: a) TCP pentru comunicare orientat pe conexiune; b) UDP pentru comunicare neorientat pe conexiune. n cazul programuilui elaborat n cadrul acestei lucrri de laborator socket-urile utilizate au avut urmtorii parametri: I. Tipul formatelor de adres IP Address Family; II. Tipul serviciului de comunicare Stream (Flux); III. Protocolul utilizat TCP; (vezi crearea socketului n codul proogramului anexa B) Dup ce a fost creat, socket-ul poate fi: conectat la un socket ndeprtat sau poate trece n starea de ateptatare ca s permit altor socket-uri s se conecteze la dnsul. 2.2. Conectarea la un socket ndeprtat: Conectarea unui socket la altul se execut utiliznd funcia Connect(), ca parametri se indic adresa IP i portul la care va fi conectat aplicaia. n cazul programuilui elaborat n cadrul acestei lucrri de laborator socket-ul creat este conectat la alt socket n cadrul aplicaiilor client care se conecteaz la server. (Vezi funcia Connect(ipe) din cadrul codului clienilor codul programului, anexa B). 2.3. Asocierea socket-ului cu adresa IP i numrul portului: Aceast procedur este n special de important pentru aplicaiile server. Ea permite conectarea socket-ului la mediul de comunicare pentru a atepta interpelrile clientilor. Aciunea n cauz este ndeplinit de ctre funcia Bind(). Funcia are nevoie de aa parametru ca: Adresa IP (care la server poate fi indicat ca Any fapt ce nseamn c socket-ul serverului se poate conecta la oricare alt socket), numrul portului aplicaiei, formatul adreselor care vor fi utilizate. n cazul programuilui elaborat n cadrul acestei lucrri de laborator funcia dat are ca parametru structura ipe, care reprezint punctul terminal al reelei din partea serverului i conine toi parametrii necesari funciei Bind() pentru funcionarea corect. IP adresa utilizat la care se conecteaz socket-urile clienilor este 127.0.0.1, iar numrul portului n cazul dat este 1100. 2.4. Socket-ul n stare de ateptare:

Pentru ca un socket s poat procesa fluxul de cereri i interpelri adresate aplicaiei n cadul creia a fost creat, socket-ul trebuie trecut n regimul de ascultare. Acest fapt se face cu ajutorul funciei Listen(). Ca parametru, finciei i-se indic un numr ntreg care va reprezenta numrul maximal de cereri de conexiune care pot fi puse n coada de ateptare. n cazul programuilui elaborat n cadrul acestei lucrri de laborator funcia Listen() este folosit n cadul aplicaiei server; valoarea parametru indicat este 15. 2.5. Acceptarea apelului de conexiune: Pentru primirea apelurilor de stabilire a conexiunii n aplicaiile sarver este utilizat funcia Accept(). n programul elaborat n cadrul lucrrii de laborator, n loc s primeasc parametri singur, funcia este atribuit socket-ului creat cs care deja conine toi parametrii necesari pentru funcionarea funciei Accept(). Dup ce procesarea unui apel de conexiune este finisat, serverul trebuie s apeleze din nou la funcia Accept() pentru a avea posibilitate s primeasc noi apeluri de conexiune. Dac n coad nu mai st nici un apel, funcia Accept() blocheaz pn nu este apelat. Exist aplicaii server cu procesare paralel i consecutiv a apelurilor. Dac aplicaiile cu procesare consecutiv a apaelurilor ateapt finisarea procesrii apelului pentru a ncepe lucrul cu un apel nou, atunci n cazul aplicaiilor cu procesare paralel apelul nou ncepe a fi procesat n dat ce a fost nregistrat. 2.6. Transmiterea datelor unui socket ndeprtat: Trimiterea datelor prin intermediul socket-ului se face cu ajutorul funciei Send() cu urmtorii parametri: I. Descriptor-ul socket-ului; II. Seciunea de memorie care conine datele menite spre a fi transmise (buffer-ul). III. Lungimea n baii a datelor menite spre a fi transmise; IV. Parametrul flag care indic particularitile modului de aciune a a funciei. n cazul programuilui elaborat n cadrul acestei lucrri de laborator funcia Send() este utilizat att n server ct i n cliuentul nr.1 pentru a transmite date codificate n form de baii, deci parametrii utilizai n mod normal direct la transmitere, n cazul dat, au fost utilizai al codificarea datelor. 2.7. Citirea datelor din socket: Pentru a citi fluxuri de date dintr-un socket este utilizat funcia Receive() cu urmtorii parametri: I. Descriptor-ul socket-ului; II. Seciunea de memorie care conine datele menite spre a fi transmise (buffer-ul). III. Lungimea n baii a datelor menite spre a fi transmise; IV. Parametrul flag care indic particularitile modului de aciune a a

funciei. n cazul programuilui elaborat n cadrul acestei lucrri de laborator funcia Receive() este folosit n codul clientului nr.2 pentru a prelua date de la server. 2.8. nchiderea unei conexiuni prin socket: Dac socket-ul nu mai este utilizat el poate fi nchis cu ajutorul funciei closesocket. n cazul programuilui elaborat n cadrul acestei lucrri de laborator nchiderea socket-urilor se esfectuiaz utiliznd funcia s.Shutdown(SocketShutdown.Both) care nchide amndou socketuri participante la o conexiune dup ce operaia de transacie a fost finisat. 3.Descrierea aplicaiei Client-Server elaborate: Aplicaia Client-Server elaborat n cadrul lucrrii de laborator date constituie un model de colaborare la nivel de socket ntre 3 aplicaii, un server i doi clienti. Figura_2

Client 1

1: Informaii

Server

Client 2

2: Confirmare de recepie 3: Cerere de date 3: Transmiterea datelor

Figura 2 : n figur este dat diagrama Secvenial prin care e reptrezentat modul de funcionare al aplicaiei elaborate.

Aplicaia reprezint un sistem de redistribuire a informaiei n care: 1. Clientul 1 reprezint sursa de date. El face legtur cu serverul i i transmite date n form de flux. 2. Serverul, care dup pornire trece n stare de ateptare, ndeplinete funcia de depozitare i retransmitere a datelor. El memoreaz toate datele intrate n timpul rulrii i la cererea Clientului 2 i transmite datele noi, care au intrat du ultima transacie de retransmitere a datelor spre Clientul 2. 3. Clientul 2 reprezint receptorul de informaie. El se conecteaz la Server i creaz cerea de date. n cazul n care Serverul nu dispune de date noi, el trimite Clientului 2 un mesaj prin care l ntiineaz despre acest fapt i nu transmite repetat datele.

Toate conexiunile se creaz la nivel de socket-uri care se inchid dup finiarea fiecrei transacii (vezi figura A.1. din anex).

Concluzia:
n rezultatul ndeplinirii lucrrii date de laborator am studiat principiile de funcionare ale aplicaiilor Client-Server i funcia socket-ului n reelele de calculator. Deasemenea, cu ajutorul aplicaiei Visual Studio, am elaborat o aplicaie Client-Server de redistribuire a informaiei n reea la cererea clientului. Sarcini i obiective realizate: 1. Aplicaie Client-Server elaborat este n stare s efectueze conexiuni ntre server i clieni la nivel de socket. 2. Ea este n stare s retransmit prin fluxuri iruri de date codificate. 3. Funcia de retransmitere a datelor ctre Client funcioneaz este iniializat de cererea clientului destinatar i nu transmite datele repetat. 4. Socket-urile utilizate se nchid n mod automat la finisarea transaciei pentru a permite formarea noilor conexiuni ntre Server i Clieni. Punctele slabe ale porgramului: 1. Aplicaie Client-Server elaborat este una foarte simpl i de aceea nu are interfa complex i nu permite introducerea mesajelor trasmise ntre entitile reelei de la tastatur. 2. n program exist un singur clien care solicit informaii de la server, iar mesajele sunt scurte i de aceea nu permit formarea cozilor de apeluri de conexiune n timpul retransmiterea mesajelor (fapt cce se ntmpl rar n situaii adevrate). 3. Serverul nu stocheaz informaia pe vre-un suport fizic i deci memoreaz datele primite doar atta timp ct ruleaz aplicaia lui.

Referine bibliografice
1. A.Tanenbaum, "Reele de calculatoare", Computer Press Agora, Tg.Mures, 1996

Dumitru Ciorb, Aplicaie client de pot electonic (partea 2), http://www.ciorba.name/, Posted by Dumitru on Nov 11, 2008

Anexa A

Figura A.1 Vedere din consolul serverului.

Anexa B
Codul Programului //server.cs
using using using using using System; System.Collections.Generic; System.Text; System.Net; System.Net.Sockets;

namespace Server { class Program { static void Main(string[] args) { int i = 0, j, s = 1; IPEndPoint ipe = new IPEndPoint(IPAddress.Any, 1100); Socket server = new Socket(ipe.AddressFamily, SocketType.Stream, ProtocolType.Tcp); server.Bind(ipe); server.Listen(15); Byte[] buffer = new byte[10]; string[] inmessage = new string[10]; while (true) { i++; Socket cs = server.Accept(); cs.Receive(buffer); Console.WriteLine(Encoding.ASCII.GetString(buffer)); inmessage[i] = Encoding.ASCII.GetString(buffer); if (inmessage[i] == "CERERE ") { if (i != s) { inmessage[i] = ""; i--; string tmessage = ""; for (j = s; j <= i; j++) { string rmessage = ""; rmessage = j + ". " + inmessage[j]; if (j == i) rmessage = rmessage + ".";

else rmessage = rmessage + ";"; tmessage = tmessage + rmessage + "\n"; } s = i + 1; byte[] tbuff = new byte[Encoding.ASCII.GetByteCount(tmessage)]; tbuff = Encoding.ASCII.GetBytes(tmessage); cs.Send(tbuff); Console.WriteLine(tmessage); Console.WriteLine("Datele au fost retransmise.\n"); cs.Shutdown(SocketShutdown.Both); cs.Close(); } else { i--; string tmessage = "Inca nu a fost introdusa nici o informatie noua.\n"; byte[] tbuff = new byte[Encoding.ASCII.GetByteCount(tmessage)]; tbuff = Encoding.ASCII.GetBytes(tmessage); cs.Send(tbuff); Console.WriteLine(tmessage); cs.Shutdown(SocketShutdown.Both); cs.Close(); } } else { string outmessage = "Mesajul nr." + i + " receptionat.\n"; byte[] sbuff = new byte[Encoding.ASCII.GetByteCount(outmessage)]; sbuff = Encoding.ASCII.GetBytes(outmessage); Console.WriteLine(outmessage); cs.Send(sbuff); cs.Shutdown(SocketShutdown.Both); cs.Close(); } } } } }

//client1.cs

using System; using System.Collections.Generic; using System.Text;

using System.Net; using System.Net.Sockets;

namespace Client1 { class Program { static void Main(string[] args) { IPEndPoint ipe = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 1100); Socket s = new Socket(ipe.AddressFamily, SocketType.Stream, ProtocolType.Tcp); s.Connect(ipe); try { String mts = "INFORMATII"; byte[] buffer = Encoding.ASCII.GetBytes(mts); Console.WriteLine(mts); s.Send(buffer); s.Shutdown(SocketShutdown.Both); s.Close(); } catch (Exception e) { Console.WriteLine(e.Message); } } } }

//client2.cs
using using using using using System; System.Collections.Generic; System.Text; System.Net; System.Net.Sockets;

namespace Client2 { class Program { static void Main(string[] args) { IPEndPoint ipe = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 1100); Socket s = new Socket(ipe.AddressFamily, SocketType.Stream, ProtocolType.Tcp);

s.Connect(ipe); try { String mts = "CERERE "; byte[] buffer = Encoding.ASCII.GetBytes(mts); Console.WriteLine(mts); s.Send(buffer); byte[] rbuffer = new byte [256]; string rm = ""; int rb = 0; do { rb = s.Receive(rbuffer, rbuffer.Length, SocketFlags.None); rm = rm + Encoding.ASCII.GetString(rbuffer); } while (rb > 0); Console.WriteLine(rm); s.Shutdown(SocketShutdown.Both); s.Close(); } catch (Exception e) { Console.WriteLine(e.Message); } } } }

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