Sunteți pe pagina 1din 48

Retele decalculatoare

Programarea inretea I
SabinCorneliu Buraga

http://www.infoiasi.ro/~busaco

Dr. Sabin-Corneliu Buraga www.infoiasi.ro/~busaco/


Ifatfirstyoudontsucceed,
youmustbeaprogrammer.
/usr/games/fortune

Dr. Sabin-Corneliu Buraga www.infoiasi.ro/~busaco/


Cuprins

Modelul client/server
APIpentru programarea inretea
Socketuri BSD
Modelul client/serverTCP

Dr. Sabin-Corneliu Buraga www.infoiasi.ro/~busaco/


Modelulclient/server

Paradigme alecomunicarii inretea:

modelul client/server

apelul procedurilor ladistanta (RPC)

comunicarea punctlapunct (peertopeer P2P)

Dr. Sabin-Corneliu Buraga www.infoiasi.ro/~busaco/


Modelulclient/server
Proces server
Ofera servicii obtinute prin retea
Accepta (iterativ sau concurent)cereri dela
unproces client,realizeaza unanumit serviciu
si returneaza rezultatul
Proces client
Initializeaza comunicarea cuserverul
Solicita unserviciu,
apoi asteapta raspunsul serverului

Dr. Sabin-Corneliu Buraga www.infoiasi.ro/~busaco/


Modelulclient/server
Client Client Process Terminal Printer File Memory
Process Process Server Server Server Server Server
Servicii nucleu (kernel)

Osingura masina
Client Client Process Terminal Printer File Memory
Process Process Server Server Server Server Server
Kernel Kernel Kernel Kernel Kernel Kernel Kernel

Masini multiple(conectate laretea)

Dr. Sabin-Corneliu Buraga www.infoiasi.ro/~busaco/


Modelul client/server
Moduri deinteractiune (viacanale decomunicatie):
orientatconexiune sefoloseste TCP
neorientatconexiune seutilizeaza UDP
Implementare:
iterativa fiecare cerere etratata pe rind,secvential
concurenta cererile sint procesate concurent
Procese copil pentru fiecare cerere deprocesat
Multiplexarea conexiunii
Tehnici combinate

Dr. Sabin-Corneliu Buraga www.infoiasi.ro/~busaco/


APIretea
Necesitatea existentei unui API
pentru realizarea deaplicatii inretea
Interfata generica pentru programare
Suport pentru comunicatii orientateconexiune si
prin mesaje
Compatibilitate cuserviciile I/Ocomune
Independenta dehardwaresi desistem deoperare
Suport pentru familii (suite)deprotocoale multiple
Independenta inreprezentarea adreselor
Oferirea deservicii speciale pentru aplicatii

Dr. Sabin-Corneliu Buraga www.infoiasi.ro/~busaco/


APIretea
TCP/IPnuincludedefinireaunuiAPI
SepotutilizamaimulteAPIuri
pentruprogramareaaplicatiilorInternet(TCP/IP)
SocketuriBSD(BerkeleySystemDistribution)
TLI(TransportLayerInterface) AT&T,XTI
Winsock
MacTCP
Functiioferite:
specificaredepuncteterminalelocalesiladistanta,
initieresiacceptaredeconexiuni,trimiteresireceptare
dedate,terminareconexiune,tratareerori
Dr. Sabin-Corneliu Buraga www.infoiasi.ro/~busaco/
Cuprins
Interfata deprogramare
aaplicatiilor (API)
bazata pe socketuri BSD
Caracterizare
Creare
Primitive

Dr. Sabin-Corneliu Buraga www.infoiasi.ro/~busaco/


Socket
Socketuri BSD (BerkeleySystemDistribution)
Facilitategenerala,independenta dehardware,
protocolsi tipul detransmitere,
pentru comunicarea intre procese
aflate pe masini diferite,inretea
Suporta pentru familii multipledeprotocoale
Protocolul domeniului UNIXpentru comunicatii
(locale)intre masini UNIX(e.g.,uucp)
Protocolul domeniului Internetfolosind TCP/IP
Altele:XNSXerox,ISO/OSI,
Independenta inreprezentarea adreselor
Dr. Sabin-Corneliu Buraga www.infoiasi.ro/~busaco/
Socket
Abstractiune aunui punct terminal(endpoint)
lanivelul transport
Utilizeaza interfata deprogramare
I/Oexistenta
(similarfisierelor,pipeurilor,FIFOurilor etc.)
Poate fi asociat cuunul/mai multe procese,
existind incadrul unui domeniu decomunicatie
Ofera unAPIpentru programarea inretea,
avind implementari multiple

Dr. Sabin-Corneliu Buraga www.infoiasi.ro/~busaco/


Socket

Similarunui descriptordefisier

Diferente apar lacreare si ladiferite operatiuni


decontrolalsocketurilor

Dr. Sabin-Corneliu Buraga www.infoiasi.ro/~busaco/


Socket|primitivedebaza
socket() creeaza unnou punct terminalalconexiunii
bind() ataseaza oadresa locala laun socket
listen() permite unui socket sa accepte conexiuni
accept() blocheaza apelantul pina lasosirea
unei cereri deconectare (utilizata deserverul TCP)
connect() tentativa (activa)destabilire aconexiunii
(folosita declientul TCP)
send()/receive() trimitere/receptare dedateviasocket
close() elibereaza conexiunea (inchide un socket)
shutdown() inchide directionalunsocket
Dr. Sabin-Corneliu Buraga www.infoiasi.ro/~busaco/
Socket
Alteapeluri
citirededate
read()/readv()/ recvfrom()/ recvmsg()
trimiterededate
write()/writev()/sendto()/sendmsg()
multiplexareI/O
select()
administrareaconexiunii
fnctl()/ioctl()/setsockopt()/getsockopt()
getsockname()/getpeername()

Dr. Sabin-Corneliu Buraga www.infoiasi.ro/~busaco/


Socketuri|tabeladedescriptori
Tabela de descriptori
0 Family: AF_INET
Service: SOCK_STREAM
1 Local IP: 193.231.30.197
2 Local Port: 80
Remote IP: 19.132.6.78
3 Remote Port: 3726
4

Dr. Sabin-Corneliu Buraga www.infoiasi.ro/~busaco/


Socketuri|creare
Apelul desistem (primitiva)socket()
#include <sys/types.h>
#include <sys/socket.h>

int socket (int domain, int type, int protocol)

Domeniul de comunicare: Protocolul utilizat


AF_UNIX, AF_INET, pentru transmitere
AF_ROUTE (uzual: 0 pentru niv. transp.)

Modalitatea de realizare a comunicarii:


SOCK_STREAM, SOCK_DGRAM, SOCK_RAW
Dr. Sabin-Corneliu Buraga www.infoiasi.ro/~busaco/
Socketuri|creare
Valoareaderetur
Succes:descriptoruldesocket creat
Eroare:1
Raportareaeroriiserealizeazaviaerrno
EMFILE
ENFILE Constante
EACCES definitein
EPROTONOSUPPORT errno.h
ENOMEM
ENOBUFFERS
EINVAL

Dr. Sabin-Corneliu Buraga www.infoiasi.ro/~busaco/


Socketuri
Domeniul &tipul unui socket
si protocoalele folosite
AF_INET AF_INET6 AF_LOCAL AF_ROUTE
SOCK_STREAM TCP TCP Da
SOCK_DGRAM UDP UDP Da
SOCK_RAW IP IPv6 Da

AF_LOCAL AF_UNIX
(dinmotiveistorice)

Dr. Sabin-Corneliu Buraga www.infoiasi.ro/~busaco/


Socketuri
Observatii
Primitiva socket() aloca resursele necesare
unui punct terminaldecomunicare,
dar nustabileste modul deadresare
Socketurile ofera unmodgenericdeadresare
Pentru TCP/IPtrebuie specificate (adresa IP,port)
Alte suitedeprotocoale potfolosi
alte schemedeadresare
Tipuri POSIX:int8_t,uint8_t,int16_t,uint16_t,int32_t,
uint32_t,u_char,u_short,u_int,u_long
Dr. Sabin-Corneliu Buraga www.infoiasi.ro/~busaco/
Socketuri
TipuriPOSIXfolositedesocketuri:
sa_family_t familiadeadrese
socklen_t lungimeastructuriidememorare
in_addr_t adresaIP(v4) Utiliz.
in_port_t numaruldeport de
Specificareaadreselorgenerice nucleu
struct sockaddr { Tipul de
uint8_t sa_len; adresa
sa_family_t sa_family;
char sa_data[14];
};
Valoarea adresei
Dr. Sabin-Corneliu Buraga www.infoiasi.ro/~busaco/
Socketuri
Tipul sockaddr permite oricare tipdeadresare
Exemplu:folosirea socketurilor
pentru comunicarea dintre studenti
Tipul deadresa:AF_STUDENTS
Valori deadrese:
Zaq 1,Moko 2,Tux 3,
Initializarea structurii AF_STUDENTS
pentru aindica unanumit student:
struct sockaddr un_stud;
un_stud.sa_family = AF_STUDENTS;
un_stud.sa_data[0] = 3;
Tux
Dr. Sabin-Corneliu Buraga www.infoiasi.ro/~busaco/
Socketuri
PentruAF_INET vomaveanevoiede
16biti numaruldeportside32biti adresaIPv4
Sefolosesteostructuraspeciala:sockaddr_in
struct sockaddr_in {
uint8_t sin_len;
sa_family_t sin_family;
in_port_t sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};
struct in_addr {
in_addr_t s_addr;
};
Dr. Sabin-Corneliu Buraga www.infoiasi.ro/~busaco/
Socketuri
sockaddr sockaddr_in
sa_len sin_len
sa_family AF_INET
sin_port
sin_addr
sa_data
sin_zero

Dr. Sabin-Corneliu Buraga www.infoiasi.ro/~busaco/


Socketuri
Toate valorile stocate insockaddr_in vor respecta
ordinea decodificare aretelei (networkbyteorder)
sin_port unnumar deportTCP/IP
sin_addr oadresa IP
h:hostbyteorder n:networkbyteorder
s:short (16biti) l:long (32biti)

uint16_t htons(uint16_t);
uint16_t ntohs(uint_16_t);

uint32_t htonl(uint32_t);
uint32_t ntohl(uint32_t);
Dr. Sabin-Corneliu Buraga www.infoiasi.ro/~busaco/
Socketuri
Pentru IPv6,sefoloseste sockaddr_in6
struct sockaddr_in {
u_int16_t sin6_family; /* AF_INET6 */
u_int16_t sin6_port;
u_int32_t sin6_flowinfo;
u_int32_t sin6_scope_id;
struct in6_addr sin6_addr;
};
struct in6_addr {
unsigned char s6_addr[16];
};
Dr. Sabin-Corneliu Buraga www.infoiasi.ro/~busaco/
Socketuri|asignareauneiadrese
Asignareauneiadreselaunsocket existent
serealizeazacubind()
int bind ( int sockfd,
const struct sockaddr *myaddr,
const! int addrlen );

Sereturneaza:0 succes,1 eroare


variabilaerrno contineeroareaefectiva:EBADF,
ENOTSOCK,EADDRINUSE,EINVAL,EACCESS
Dr. Sabin-Corneliu Buraga www.infoiasi.ro/~busaco/
Socketuri|asignareauneiadrese
Exemplu:
#define PORT 7000
int sd, eroare;
struct sockaddr_in adresa;

sd = socket (AF_INET, SOCK_STREAM, 0); /* TCP */


adresa.sin_family = AF_INET; /* umplerea structurii */
adresa.sin_port = htons (PORT); /* portul */
adresa.sin_addr = htonl (adresaIP); /* adresa IP */

eroare = bind (sd, (sockaddr *) &adresa, sizeof (adresa));

Dr. Sabin-Corneliu Buraga www.infoiasi.ro/~busaco/


Socketuri|asignareauneiadrese
Utilizari alelui bind()
Serverul doreste sa ataseze unsocket launportpre
stabilit (pentru aoferi servicii viaacel port)
Clientul vrea sa ataseze unsocket launportspecificat
Clientul cere sistemului deoperare sa asigneze
orice portdisponibil
Inmodnormal,clientul nunecesita atasarea
launportspecificat
Alegerea oricarui portliber:
adresa.port = htons (0);

Dr. Sabin-Corneliu Buraga www.infoiasi.ro/~busaco/


Socketuri|asignareauneiadrese

Alegerea adresei IPlabind()


Daca gazda areasignate mai multe adrese IP?
Cumserezolva independenta deplatforma?

Pentru aatasa unsocket laadresa IPlocala,seva utiliza


inlocul unei adrese IPconstanta INADDR_ANY

Dr. Sabin-Corneliu Buraga www.infoiasi.ro/~busaco/


Socketuri|asignareauneiadrese

Conversia adreselor IP:


int inet_aton ( void *, struct in_addr *);
ASCIIx.x.x.x reprezentare interna pe 32biti
char *inet_ntoa ( struct in_addr );
reprezentare 32biti (networkbyteorder)
ASCIIx.x.x.x

vezi si functia inet_addr()

Dr. Sabin-Corneliu Buraga www.infoiasi.ro/~busaco/


Socketuri|asignareauneiadrese

Observatii:
Pentru IPv6inlocul constantei INADDR_ANY
seva folosi vezi antetul netinet/in.h:
serv.sin6.addr = in6addr_any;
Functiile deconversie pentru IPv6sunt:
inet_pton()
inet_ntop()

Dr. Sabin-Corneliu Buraga www.infoiasi.ro/~busaco/


Socketuri|listen()
Stabilirea modului pasiv deinteractiune
Adresa intotdeauna este cunoscuta
Nucleul sistemului va trebui sa accepte cereri
deconectare directionate laadresa lacare
este atasat socketul
3wayhandshake Numarul
Conexiunile multiplereceptionate de conex.
vor fi plasate introcoada deasteptare din coada
Sereturneaza 0 =succes,1 =eroare de astept.
int listen ( int sockfd, int backlog );

Socket TCP atasat unei adrese


Dr. Sabin-Corneliu Buraga www.infoiasi.ro/~busaco/
Socketuri|listen()
Remarci:
Alegerea valorii backlog depinde
deaplicatie inmoduzual 5
Serverele HTTPar trebui sa specifice
ovaloare backlog citmai mare
(dincauza incarcarii cucereri multiple)

Dr. Sabin-Corneliu Buraga www.infoiasi.ro/~busaco/


Socketuri|accept()
Asteptareaconexiunilordinparteaclientilor
Cindaplicatiaestepregatitapentruatrataonoua
conexiune,vatrebuisainterogamsistemulasupra
uneialteconexiunicuunclient
Socket TCP
int accept( int sockfd, (mod pasiv)
struct sockaddr* cliaddr,
socklen_t *addrlen );

trebuie initial sa fie egal cu lungimea structurii cliaddr


se va returna numarul de bytes folositi in cliaddr
Sereturneazadescriptoruldesocket corespunzator
punctuluiterminalalclientuluisau1 =eroare
Dr. Sabin-Corneliu Buraga www.infoiasi.ro/~busaco/
Socketuri|connect()
Incercarea deastabili oconexiune cuserverul
Stabilirea unui punct terminal(alserverului)
Nunecesita atasarea cubind(),sistemul
deoperare va asigna oadresa locala (IP,port)
Seincearca stabilirea unei conexiuni
3wayhandshake Socket TCP

int connect( int sockfd,


const struct sockaddr *server,
socklen_t addrlen );
Contine adresa
serverului
(IP, port)
Dr. Sabin-Corneliu Buraga www.infoiasi.ro/~busaco/
Socketuri|connect()
Returneaza:
Valoarea 0 =succes
Valoarea 1 =eroare
EISCONN
ETIMEDOUT
ECONNREFUSED
ENETUNREACH
EADDRINUSE
EINPROGRESS
EADDRNOTAVAIL
EAFNOSUPPORT

Dr. Sabin-Corneliu Buraga www.infoiasi.ro/~busaco/


I/OTCP|read()
Apelul este blocant inmodnormal,
read() returneaza doar cind exista datedisponibile
Citirea delaunsocket TCPpoate returna
mai putini octeti decit numarul maximdorit
Trebuie sa fim pregatiti sa citim cite1byte
launmomentdat!
Daca partenerul ainchis conexiunea si numai sunt date
deprimit,sereturneaza 0 (EOF)
Erori:EINTR unsemnal aintrerupt citirea,
EIO eroare I/O,EWOULDBLOCK socketul nuaredate
introcitire neblocanta
int read ( int sockfd, void *buf, int max );
Dr. Sabin-Corneliu Buraga www.infoiasi.ro/~busaco/
I/OTCP|write()
Apelulesteblocantinmodnormal
Pentruunsocket neblocant,
write() poatescriemaiputindenum octeti
int write ( int sockfd, void *buf, int num );

Erori:
EPIPE scrierelaunsocket neconectat
EWOULDBLOCK nusepotacceptadate
farablocare,insaoperatiuneaestesetata
cafiindneblocanta

Dr. Sabin-Corneliu Buraga www.infoiasi.ro/~busaco/


I/OTCP|exemplu
#define MAXBUF 127 /* lungime buffer citire */
char *cerere = da-mi ceva;
char buf[MAXBUF]; /* buffer pentru raspuns */
char *pbuf = buf; /* pointer la buffer */
int n, lung = MAXBUF;
/* nr. bytes cititi,
nr. bytes liberi in buffer */
/* trimitem cererea */
write (sd, cerere, strlen (cerere));
/* asteaptam raspunsul */
while ((n = read (sd, pbuf, lung)) > 0) {
pbuf += n;
lung -= n;
} Comunicarea dintre clientsi server
Dr. Sabin-Corneliu Buraga www.infoiasi.ro/~busaco/
Inchidereaconexiunii|close()
Terminarea gratioasaaconexiunii
Dealocarea memoriei alocate socketului
3wayhandshake pentru inchiderea conexiunii
Pentru procese carepartajeaza acelasi socket,
sedecrementeaza numarul dereferinte laacel socket;
cind ajunge la0,socketul este dealocat
int close ( int sockfd );
Probleme
Serverul nupoate termina conexiunea,
nustie daca si cind clientul nuva mai trimite si alte cereri
Clientul nupoate sti daca datele auajuns laserver

Dr. Sabin-Corneliu Buraga www.infoiasi.ro/~busaco/


Inchidereaconexiunii|shutdown()
Inchidereaunidirectionala
Cindunclientterminadetrimiscererile,poateapela
shutdown() pentruaspecificafaptulcanuvamaitrimite
datepesocket,faraadealocasocketul
ServerulvaprimiEOF si,dupaexpediereacatreclient
aultimuluiraspuns,vaputeainchideconexiunea
int shutdown ( int sockfd, int dir );

0 nu se accepta operatii de citire (SHUT_RD)


1 nu se accepta operatii de scriere (SHUT_WR)
2 nu se accepta operatii I/O
inchidere in ambele sensuri (SHUT_RDWR)
Dr. Sabin-Corneliu Buraga www.infoiasi.ro/~busaco/
MetaphorforGoodRelationships
CopyrightDr.LaurasNetworkProgrammingCorp.

Tosucceedinrelationships
youneedtoestablishyourownidentity.
youneedtobeopen&accepting.
youneedtoestablishcontacts.
youneedtotakethingsastheycome,notas
youexpectthem.
youneedtohandleproblemsastheyarise.

Dr. Sabin-Corneliu Buraga www.infoiasi.ro/~busaco/


Client/serverTCP|server
Modelul unui serverTCPiterativ
Creare socket pentru tratarea conexiunilor cuclientii:socket()
Pregatirea structurilor dedate(sockaddr_in)
Atasarea socketului laadresa locala (port):bind()
Pregatirea socketului pentru ascultarea portului
invederea stabilirii conexiunii cuclientii:listen()
Asteptarea realizarii unei conexiuni cuunanumit client
(deschidere pasiva):accept()
Procesarea cererilor clientului,folosindusesocketul returnat
deaccept():succesiune deread()/write()
Inchiderea (directionata)aconexiunii cuclientul:
close(),shutdown()

Dr. Sabin-Corneliu Buraga www.infoiasi.ro/~busaco/


Client/serverTCP|client
ModelulunuiclientTCPiterativ
Crearesocket pentruconectarealaserver:socket()
Pregatireastructurilordedate(sockaddr_in)
Atasareasocketului:bind() optional
Conectarealaserver(deschidereactiva):connect()
Solicitareadeserviciisireceptionarearezultatelor
trimisedeserver:succesiunedewrite()/read()
Inchiderea(directionata)aconexiuniicuserverul:
close(),shutdown()

Dr. Sabin-Corneliu Buraga www.infoiasi.ro/~busaco/


Dr. Sabin-Corneliu Buraga www.infoiasi.ro/~busaco/
Rezumat
Modelul client/server
APIpentru programarea inretea
Socketuri BSD
Caracterizare
Creare
Primitive
Modelul client/serverTCP

Dr. Sabin-Corneliu Buraga www.infoiasi.ro/~busaco/


Intrebari?

Dr. Sabin-Corneliu Buraga www.infoiasi.ro/~busaco/

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