Documente Academic
Documente Profesional
Documente Cultură
- Documentaţie
- Exemple
1. Introducere
2. Interfaţa Socket API
3. Socket-uri în Unix
o Comunicaţie client-server pe TCP/IP
o Comunicaţie client-server pe UDP/IP
1. Introducere
- protocoalele TPC/IP de nivel transport oferă servicii ce permit programelor nivelului aplicaţie să comunice între ele
prin intermediul mesajelor;
- când o aplicaţie trimite o cerere către nivelul transport pentru a trimite un mesaj, protocolul folosit la acest nivel:
o împarte informaţia în pachete
o adaugă un antet de pachet care include adresa destinaţiei
o trimite informaţia nivelului reţea pentru procesare ulterioară
- transmisa şi recepţia datelor se realizează prin intermediul unor porturi de pe server, care identifică destinaţia specifică a
mesajului;
- nivelul transport este implementat în reţelele TCP/IP prin intermediul a două protocoale:
o UDP (User Datagram Protocol)–protocol datagramă utilizator –
Asigură servicii de tip datagramă nivelului aplicaţie;
Nu este fiabil (nu asigură certitudinea livrării datagramelor, nici mecanismele de protecţie la pierderea sau
duplicarea datagramelor);
Viteză mare de transmisie;
Este un serviciu fără conexiune (emiţătorul nu cunoaşte starea receptorului în momentul transmisiei);
Pt. transferul datelor foloseşte nişte entităţi abstracte, numite porturi de protocol, identificate prin numere întregi
pozitive şi care au asociate nişte cozi de mesaje prin care se transmit mesajele;
Se utilizează pt. mesaje mici (sub 8KB) cu viteză mare;
Antetul datagramei UDP conţine:
Source Port Number- adresa portului sursă;
Destination Port Number – adresa portului destinaţie;
Length – lunginea datagramei în bytes;
Checksum – suma de control asociată datagramei (foloseşte acelaşi algoritm ca la protocolul IP)
o TCP (Transmission Control Protocol)- protocol de control al transmisiei
Este fiabil (asigură integritatea datelor transmise, mecanisme de protecţie la pierderea sau duplicarea pachetelor,
păstrarea numărului de secvenţă, mecanisme de control al fluxului de date în reţea);
Asigură transmisia blocurilor continue de date între porturile de protocol asociate aplicaţiilor;
Dimensiunea mesajelor nu este limitată;
Viteza de transfer mai mică;
- SO oferă programelor la nivel aplicaţie o interfaţă comună pt. aceste 2 protocoale, şi anume interfaţa socket.
Exemplu
În acest exemplu, serverul păstrează evidenţa numărului de clienţi care au accesat resursa şi raportează acest număr la fiecare apel.
Exemplu de folosire a interfeţei sockets.
Clientul apelează:
gethostbyname pentru a converti numele unui calculator în adresa IP
getprotobyname pentru a converti numele unui protocol în forma binară folosită de sockets
socket pentru a crea un socket
connect pentru a conecta socket-ul la un server
recv (în mod repetat) pentru transferul tuturor datelor de la server (clientul nu are de unde şti dacă serverul transmite datele
ăntr-un singur mesaj sau în mai multe)
close pentru a închide socket-ul.
Serverul apelează:
getprotobyname pentru a converti numele unui protocol în forma binară folosită de sockets
socket pentru a crea un socket
bind pentru a specifica portul local pentru socket
listen pentru a plasa socket-ul în modul pasiv, apoi în buclă
accept pentru a ccepta o cerere de conectare şi a crea un socket nou poentru această conexiune
send pentru a trimite date
close pentru a închide noul socket.
Primitive blocante folosite sunt accept, connect (3 way handshake) şi gethostbyname (conectare cu un server de nume).
3. Socket-uri în Unix
– inovaţie a sistemului Berkeley UNIX;
– este un punct de comunicaţie prin care un proces poate emite sau recepţiona informaţie sub forma unui flux de bytes;
– este identificat printr-un descriptor, asemănător cu cel pentru fişier
– realizează următoarele operaţii elementare:
o conectarea la staţia de la distanţă
o emiterea datelor
o recepţionarea datelor
o închiderea unei conexiuni
o ataşarea la un port
o aşteptarea cererilor de conexiune emise de staţiile de la distanţă
o acceptarea cererilor de conexiune la portul local
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <errno.h>
#include <netdb.h>
char buffer[32];
struct sockaddr_in client, server; /*adresele client, server*/
if(argc!= 2)
exit(1);
if(gethostname(buffer, 32))
if (!(srvinfo=gethostbyname(buffer)))
/*Creeaza un socket*/
exit(3);
server.sin_port = htons(port);
exit(4);
/*Creeaza coada pentru cererile de conexiune; va prelua maxim 5 cereri de conexiune de la clienti, restul fiind refuzate */
if (listen(s, 5) != 0)
exit(5);
namelen = sizeof(client);
exit(6);
exit(7);
perror("Eroare la transmisie");
exit(8);
close(ns);
close(s);
exit(0);
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <errno.h>
#include <netdb.h>
if (argc != 3)
{
printf("Apel: %s hostname port \n", argv[0]);
exit(1);
}
{
perror("Eroare la preluarea numelui serverului");
exit(3);
}
/* Confirmare de la server */
if (recv(s, buffer, 32, 0) < 0)
{
perror("Eroare la receptie");
exit(7);
}
close(s);
exit(0);
}
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <errno.h>
#include <netdb.h>
main()
char buffer[32];
exit(1);
memset(&server, 0, sizeof(server));
server.sin_addr.s_addr = INADDR_ANY;
exit(2);
namelen = sizeof(server);
namelen = sizeof(client);
/*
*/
if (read(s,buffer,32)<0)
exit(4);
/*printf("Parametrii: \n Nume domeniu: %s \n \Port: %d \n Adresa \Internet: %s \n", (client.sin_family == AF_INET? "AF_INET":"AF_UNIX"), ntohs(client.sin_port),
inet_ntoa(client.sin_addr)); */
printf("Parametrii: \n Nume domeniu: %s \n \Port: %d \n Adresa \Internet: %s \n", (server.sin_family == AF_INET? "AF_INET":"AF_UNIX"), ntohs(server.sin_port),
inet_ntoa(server.sin_addr));
close(s);
exit(0);
}
/* Modul CLIENT UCP */
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <errno.h>
#include <netdb.h>
unsigned short port; /* portul client, acelasi ca cel specificat in modulul server */
char buffer[32];
int s, rc;
if(argc!= 2)
exit(1);
exit(2);
exit(3);
close(s);
exit(0);