Computer Networks. Internet programming basics

46
Retele Retele de de calculatoare calculatoare Sabin Sabin - - Corneliu Corneliu Buraga Buraga 2006/2007 2006/2007 www.infoiasi.ro/~busaco www.infoiasi.ro/~busaco / / [ [ 1 1 ] ] Retele Retele de de calculatoare calculatoare Programarea Programarea in in retea retea I I Sabin-Corneliu Buraga [email protected] http://www.infoiasi.ro/~busaco

description

Computer Networks course (in Romanian).

Transcript of Computer Networks. Internet programming basics

Page 1: Computer Networks. Internet programming basics

ReteleRetele de de calculatoarecalculatoare

SabinSabin--CorneliuCorneliu BuragaBuraga 2006/2007 2006/2007 –– www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// [[11]]

ReteleRetele de de calculatoarecalculatoareProgramareaProgramarea in in retearetea –– II

Sabin-Corneliu [email protected]

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

Page 2: Computer Networks. Internet programming basics

ReteleRetele de de calculatoarecalculatoare

SabinSabin--CorneliuCorneliu BuragaBuraga 2006/2007 2006/2007 –– www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// [[22]]

CuprinsCuprins

• Modelul client/server• API pentru programarea in retea• Socket-uri BSD• Modelul client/server TCP

Page 3: Computer Networks. Internet programming basics

ReteleRetele de de calculatoarecalculatoare

SabinSabin--CorneliuCorneliu BuragaBuraga 2006/2007 2006/2007 –– www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// [[33]]

ModelulModelul client/serverclient/server• Paradigme ale comunicarii in retea:

– Modelul client/server– Apelul procedurilor la distanta (RPC)– Comunicarea punct-la-punct (peer-to-peer – P2P)

• Proces server– Ofera servicii obtinute prin retea– Accepta (iterativ sau concurent) cereri de la

un proces client, realizeaza un anumit serviciusi returneaza rezultatul

• Proces client– Initializeaza comunicarea cu serverul– Solicita un serviciu,

apoi asteapta raspunsul serverului

Page 4: Computer Networks. Internet programming basics

ReteleRetele de de calculatoarecalculatoare

SabinSabin--CorneliuCorneliu BuragaBuraga 2006/2007 2006/2007 –– www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// [[44]]

ModelulModelul client/serverclient/serverClientClient

ProcessProcessClient

ProcessProcessServer

TerminalServer

PrinterServer

FileFileServerServer

MemoryServer

Servicii nucleu (kernel)

ClientProcess

ClientClientProcessProcess

ProcessServer

TerminalServer

PrinterServer

FileFileServerServer

MemoryServer

Kernel Kernel Kernel Kernel Kernel Kernel Kernel

O singura masina

Masini multiple (conectate la retea)

Page 5: Computer Networks. Internet programming basics

ReteleRetele de de calculatoarecalculatoare

SabinSabin--CorneliuCorneliu BuragaBuraga 2006/2007 2006/2007 –– www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// [[55]]

ModelulModelul client/serverclient/server• Moduri de interactiune

(via canale de comunicatie)– Orientat conexiune – se foloseste TCP– Neorientat conexiune – se utilizeaza UDP

• Implementare– Iterativa – fiecare cerere este tratata pe rind,

secvential– Concurenta – cererile sint procesate concurent

• Procese copil pentru fiecare cerere de procesat• Multiplexarea conexiunii• Tehnici combinate

Page 6: Computer Networks. Internet programming basics

ReteleRetele de de calculatoarecalculatoare

SabinSabin--CorneliuCorneliu BuragaBuraga 2006/2007 2006/2007 –– www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// [[66]]

API API retearetea• Necesitatea existentei unui API

pentru realizarea de aplicatii in retea– Interfata generica pentru programare– Suport pentru comunicatii orientate-conexiune si

prin mesaje– Compatibilitate cu serviciile I/O comune– Independenta de hardware si de sistem de operare– Suport pentru familii (suite) de protocoale multiple– Independenta in reprezentarea adreselor– Oferirea de servicii speciale pentru aplicatii

Page 7: Computer Networks. Internet programming basics

ReteleRetele de de calculatoarecalculatoare

SabinSabin--CorneliuCorneliu BuragaBuraga 2006/2007 2006/2007 –– www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// [[77]]

API API retearetea• TCP/IP nu include definirea unui API• Se pot utiliza mai multe API-uri

pentru programarea aplicatiilor Internet (TCP/IP)– Socket-uri BSD (Berkeley System Distribution)– TLI (Transport Layer Interface) – AT&T, XTI– Winsock– MacTCP

• Functii oferite: specificare de puncte terminale locale si la distanta, initiere si acceptare de conexiuni, trimitere sireceptare de date, terminare conexiune, tratare erori

Page 8: Computer Networks. Internet programming basics

ReteleRetele de de calculatoarecalculatoare

SabinSabin--CorneliuCorneliu BuragaBuraga 2006/2007 2006/2007 –– www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// [[88]]

CuprinsCuprins

• Interfata de programarebazata pe socket-uri BSD– Caracterizare– Creare– Primitive

Page 9: Computer Networks. Internet programming basics

ReteleRetele de de calculatoarecalculatoare

SabinSabin--CorneliuCorneliu BuragaBuraga 2006/2007 2006/2007 –– www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// [[99]]

SocketSocket• Socket-uri BSD (Berkeley System Distribution)• Facilitate generala, independenta de

hardware, protocol si tipul de transmitere, pentru comunicarea intre procese aflate pemasini diferite, in retea

• Suporta pentru familii multiple de protocoale– Protocolul domeniului UNIX pentru comunicatii

(locale) intre masini UNIX (e.g., uucp) – Protocolul domeniului Internet folosind TCP/IP– Altele: XNS Xerox, ISO/OSI,…

• Independenta in reprezentarea adreselor

Page 10: Computer Networks. Internet programming basics

ReteleRetele de de calculatoarecalculatoare

SabinSabin--CorneliuCorneliu BuragaBuraga 2006/2007 2006/2007 –– www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// [[1010]]

SocketSocket• Abstractiune a unui punct terminal (end-point)

la nivelul transport• Utilizeaza interfata de programare

I/O existenta(similar fisierelor, pipe-urilor, FIFO-urilor etc.)

• Poate fi asociat cu unul/mai multe procese, existind in cadrul unui domeniu de comunicatie

• Ofera un API pentru programarea in retea, avind implementari multiple

Page 11: Computer Networks. Internet programming basics

ReteleRetele de de calculatoarecalculatoare

SabinSabin--CorneliuCorneliu BuragaBuraga 2006/2007 2006/2007 –– www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// [[1111]]

SocketSocket• Similar unui descriptor de fisier• Diferente apar la creare si

la diferite operatiuni de control al socket-urilor• Apeluri principale

– socket() creeaza un nou punct terminal al conexiunii– bind() ataseaza o adresa locala la un socket– listen() permite unui socket sa accepte conexiuni– accept() blocheaza apelantul pina la sosirea

unei cereri de conectare (utilizata de serverul TCP)– connect() tentativa (activa) de stabilire a conexiunii

(folosita de clientul TCP)– send()/receive() trimitere/receptare de date via socket– close() elibereaza conexiunea (inchide un socket)– shutdown() inchide directional un socket

Page 12: Computer Networks. Internet programming basics

ReteleRetele de de calculatoarecalculatoare

SabinSabin--CorneliuCorneliu BuragaBuraga 2006/2007 2006/2007 –– www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// [[1212]]

SocketSocket

• Alte apeluri– citire de date

read() / readv() / recvfrom() / recvmsg()– trimitere de date

write() / writev() / sendto() / sendmsg()– multiplexare I/O

select()– administrarea conexiunii

fnctl() / ioctl() / setsockopt() / getsockopt()getsockname() / getpeername()

Page 13: Computer Networks. Internet programming basics

ReteleRetele de de calculatoarecalculatoare

SabinSabin--CorneliuCorneliu BuragaBuraga 2006/2007 2006/2007 –– www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// [[1313]]

SocketSocket--uriuri• Implementarea

socket-urilorin nucleul Linux

Page 14: Computer Networks. Internet programming basics

ReteleRetele de de calculatoarecalculatoare

SabinSabin--CorneliuCorneliu BuragaBuraga 2006/2007 2006/2007 –– www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// [[1414]]

SocketSocket--uri|tabelauri|tabela de de descriptoridescriptoriTabelaTabela de de descriptoridescriptori

0

1

2

3

4

Family: AF_INETService: SOCK_STREAMLocal IP: 193.231.30.197Local Port: 80Remote IP: 19.132.6.78Remote Port: 3726

Family: Family: AF_INETAF_INETService: Service: SOCK_STREAMSOCK_STREAMLocal IP: Local IP: 193.231.30.197193.231.30.197Local Port: Local Port: 8080Remote IP: Remote IP: 19.132.6.7819.132.6.78Remote Port: Remote Port: 37263726

Page 15: Computer Networks. Internet programming basics

ReteleRetele de de calculatoarecalculatoare

SabinSabin--CorneliuCorneliu BuragaBuraga 2006/2007 2006/2007 –– www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// [[1515]]

SocketSocket--uri|creareuri|creare• Primitiva socket()

#include <sys/types.h>#include <sys/socket.h>

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

Domeniul de comunicare: AF_UNIX, AF_INET,

AF_ROUTE

Protocolul utilizatpentru transmitere

(uzual: 0 pentru niv. transp.)

Modalitatea de realizare a comunicarii: SOCK_STREAM, SOCK_DGRAM, SOCK_RAW

Page 16: Computer Networks. Internet programming basics

ReteleRetele de de calculatoarecalculatoare

SabinSabin--CorneliuCorneliu BuragaBuraga 2006/2007 2006/2007 –– www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// [[1616]]

SocketSocket--uri|creareuri|creare• Valoarea de retur

– Succes: descriptorul de socket creat– Eroare: –1

• Raportarea erorii se realizeaza via errno– EMFILE – ENFILE– EACCES– EPROTONOSUPPORT– ENOMEM– ENOBUFFERS– EINVAL

Constantedefinite in errno.h

Page 17: Computer Networks. Internet programming basics

ReteleRetele de de calculatoarecalculatoare

SabinSabin--CorneliuCorneliu BuragaBuraga 2006/2007 2006/2007 –– www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// [[1717]]

SocketSocket--uriuri• Domeniul & tipul unui socket

si protocoalele folosite

AF_LOCAL ≡ AF_UNIX(din motive istorice)

AF_INET AF_INET6 AF_LOCAL AF_ROUTE SOCK_STREAM TCP TCP Da SOCK_DGRAM UDP UDP Da

SOCK_RAW IP IPv6 Da

Page 18: Computer Networks. Internet programming basics

ReteleRetele de de calculatoarecalculatoare

SabinSabin--CorneliuCorneliu BuragaBuraga 2006/2007 2006/2007 –– www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// [[1818]]

SocketSocket--uriuri• Observatii

– Primitiva socket() aloca resursele necesareunui punct terminal de comunicare, dar nu stabileste modul de adresare

– Socket-urile ofera un mod generic de adresare– Pentru TCP/IP trebuie specificate (adresa IP, port)– Alte suite de protocoale pot folosi

alte scheme de adresare• Tipuri POSIX: int8_t, uint8_t, int16_t, uint16_t,

int32_t, uint32_t, u_char, u_short, u_int, u_long

Page 19: Computer Networks. Internet programming basics

ReteleRetele de de calculatoarecalculatoare

SabinSabin--CorneliuCorneliu BuragaBuraga 2006/2007 2006/2007 –– www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// [[1919]]

SocketSocket--uriuri• Tipuri POSIX folosite de socket-uri:

– sa_family_t – familia de adrese– socklen_t – lungimea structurii de memorare– in_addr_t – adresa IP (v4) – in_port_t – numarul de port

• Specificarea adreselor genericestruct sockaddr {

uint8_t sa_len;sa_family_t sa_family; char sa_data[14];

};

Tipul de adresa

Valoarea adresei

Utiliz. de

nucleu

Page 20: Computer Networks. Internet programming basics

ReteleRetele de de calculatoarecalculatoare

SabinSabin--CorneliuCorneliu BuragaBuraga 2006/2007 2006/2007 –– www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// [[2020]]

SocketSocket--uriuri• Tipul sockaddr permite utilizarea

oricarui tip de adresare• Exemplu: folosirea socket-urilor

pentru comunicarea dintre studenti– Tipul de adresa: AF_STUDENTS– Valori de adrese:

Wana ⇔ 1, Moko ⇔ 2, Tux ⇔ 3,…– Initializarea structurii AF_STUDENTS

pentru a indica un anumit student: struct sockaddr un_stud;un_stud.sa_family = AF_STUDENTS;un_stud.sa_data[0] = 3; ☺☺

Tux

Page 21: Computer Networks. Internet programming basics

ReteleRetele de de calculatoarecalculatoare

SabinSabin--CorneliuCorneliu BuragaBuraga 2006/2007 2006/2007 –– www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// [[2121]]

SocketSocket--uriuri• Pentru AF_INET vom avea nevoie de

16 biti – numarul de port si de 32 biti – adresa IPv4• Se foloseste o structura speciala: sockaddr_instruct 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;};

Page 22: Computer Networks. Internet programming basics

ReteleRetele de de calculatoarecalculatoare

SabinSabin--CorneliuCorneliu BuragaBuraga 2006/2007 2006/2007 –– www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// [[2222]]

SocketSocket--uriuri

sin_lensin_lensa_lensa_lensa_familysa_family

sa_datasa_data

AF_INETAF_INETsin_portsin_port

sin_addrsin_addr

sin_zerosin_zero

sockaddrsockaddr sockaddr_insockaddr_in

Page 23: Computer Networks. Internet programming basics

ReteleRetele de de calculatoarecalculatoare

SabinSabin--CorneliuCorneliu BuragaBuraga 2006/2007 2006/2007 –– www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// [[2323]]

SocketSocket--uriuri• Toate valorile stocate in sockaddr_in vor respecta

ordinea de codificare a retelei (network byte order)– sin_port un numar de port TCP/IP– sin_addr o adresa IP

• ‘h’ : host byte order ‘n’ : network byte order• ‘s’ : short (16bit) ‘l’ : long (32bit)

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

uint32_t htonl(uint32_t);uint32_t ntohl(uint32_t);

Page 24: Computer Networks. Internet programming basics

ReteleRetele de de calculatoarecalculatoare

SabinSabin--CorneliuCorneliu BuragaBuraga 2006/2007 2006/2007 –– www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// [[2424]]

SocketSocket--uriuri• Pentru IPv6, se foloseste sockaddr_in6struct 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];

};

Page 25: Computer Networks. Internet programming basics

ReteleRetele de de calculatoarecalculatoare

SabinSabin--CorneliuCorneliu BuragaBuraga 2006/2007 2006/2007 –– www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// [[2525]]

SocketSocket--uri|asignareauri|asignarea uneiunei adreseadrese• Asignarea unei adrese la un socket

existent se realizeaza cu bind()int bind ( int sockfd,

const struct sockaddr *myaddr,int addrlen );

• Se returneaza: 0 succes, –1 eroarevariabila errno contine eroarea efectiva: EBADF, ENOTSOCK, EADDRINUSE, EINVAL, EACCESS

const!

Page 26: Computer Networks. Internet programming basics

ReteleRetele de de calculatoarecalculatoare

SabinSabin--CorneliuCorneliu BuragaBuraga 2006/2007 2006/2007 –– www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// [[2626]]

SocketSocket--uri|asignareauri|asignarea uneiunei adreseadrese• Exemplu:

#define PORT 7000int 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));

Page 27: Computer Networks. Internet programming basics

ReteleRetele de de calculatoarecalculatoare

SabinSabin--CorneliuCorneliu BuragaBuraga 2006/2007 2006/2007 –– www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// [[2727]]

SocketSocket--uri|asignareauri|asignarea uneiunei adreseadrese• Utilizari ale lui bind()

– Serverul doreste sa ataseze un socket la un port pre-stabilit (pentru a oferi servicii via acel port)

– Clientul vrea sa ataseze un socket la un port specificat

– Clientul cere sistemului de operare sa asignezeorice port disponibil

• In mod normal, clientul nu necesita atasareala un port specificat

• Alegerea oricarui port liber: adresa.port = htons (0);

Page 28: Computer Networks. Internet programming basics

ReteleRetele de de calculatoarecalculatoare

SabinSabin--CorneliuCorneliu BuragaBuraga 2006/2007 2006/2007 –– www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// [[2828]]

SocketSocket--uri|asignareauri|asignarea uneiunei adreseadrese• Alegerea adresei IP la bind()

– Daca gazda are asignate mai multe adrese IP?– Cum se rezolva independenta de platforma?

• Pentru a atasa un socket la adresa IP locala, se vautiliza in locul unei adrese IP constanta INADDR_ANY

• Conversia adreselor IP:– int inet_aton ( char *, struct in_addr *);ASCII “x.x.x.x” ⇒ reprezentare interna pe 32 biti

– char *inet_ntoa ( struct in_addr );reprezentare 32 biti (network byte order) ⇒ ASCII “x.x.x.x”vezi si functia inet_addr()

Page 29: Computer Networks. Internet programming basics

ReteleRetele de de calculatoarecalculatoare

SabinSabin--CorneliuCorneliu BuragaBuraga 2006/2007 2006/2007 –– www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// [[2929]]

SocketSocket--uri|asignareauri|asignarea uneiunei adreseadrese

• Observatii:– Pentru IPv6 in locul constantei INADDR_ANY

se va folosi (vezi antetul netinet/in.h):serv.sin6.addr = in6addr_any;

– Functiile de conversie pentru IPv6 sunt:•inet_pton()•inet_ntop()

Page 30: Computer Networks. Internet programming basics

ReteleRetele de de calculatoarecalculatoare

SabinSabin--CorneliuCorneliu BuragaBuraga 2006/2007 2006/2007 –– www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// [[3030]]

SocketSocket--uri|listenuri|listen()()• Stabilirea modului pasiv de interactiune

– Adresa intotdeauna este cunoscuta– Nucleul sistemului va trebui sa accepte cereri

de conectare directionate la adresa la care este atasat socket-ul

• 3-way handshake– Conexiunile multiple receptionate

vor fi plasate intr-o coada de asteptare– Se returneaza 0 = succes, –1 = eroare

int listen ( int sockfd, int backlog );

Socket TCP atasat unei adrese

Numarulde conex. din coadade astept.

Page 31: Computer Networks. Internet programming basics

ReteleRetele de de calculatoarecalculatoare

SabinSabin--CorneliuCorneliu BuragaBuraga 2006/2007 2006/2007 –– www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// [[3131]]

SocketSocket--uri|listenuri|listen()()

• Remarci:– Alegerea valorii backlog depinde

de aplicatie (in mod uzual 5)– Serverele HTTP trebuie sa specifice

o valoare backlog cit mai mare (din cauza incarcarii cu cereri multiple)

Page 32: Computer Networks. Internet programming basics

ReteleRetele de de calculatoarecalculatoare

SabinSabin--CorneliuCorneliu BuragaBuraga 2006/2007 2006/2007 –– www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// [[3232]]

SocketSocket--uri|accepturi|accept()()• Asteptarea conexiunilor din partea clientilor

– Cind aplicatia este pregatita pentru a trata o nouaconexiune, va trebui sa interogam sistemul asupraunei alte conexiuni cu un client

– Se returneaza descriptorul de socket corespunzatorpunctului terminal al clientului sau –1 = eroare

int accept( int sockfd,struct sockaddr* cliaddr, socklen_t *addrlen );

Socket TCP (mod pasiv)

• trebuie initial sa fie egal cu lungimea structurii cliaddr• se va returna numarul de bytes folositi in cliaddr

Page 33: Computer Networks. Internet programming basics

ReteleRetele de de calculatoarecalculatoare

SabinSabin--CorneliuCorneliu BuragaBuraga 2006/2007 2006/2007 –– www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// [[3333]]

SocketSocket--uri|connecturi|connect()()• Incercarea de a stabili o conexiune cu serverul

– Stabilirea unui punct terminal (al serverului)– Nu necesita atasarea cu bind(), sistemul

de operare va asigna o adresa locala (IP, port)– Se incearca stabilirea unei conexiuni

• 3-way handshake

int connect( int sockfd,const struct sockaddr *server,socklen_t addrlen );

Socket TCP

Contine adresaserverului(IP, port)

Page 34: Computer Networks. Internet programming basics

ReteleRetele de de calculatoarecalculatoare

SabinSabin--CorneliuCorneliu BuragaBuraga 2006/2007 2006/2007 –– www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// [[3434]]

SocketSocket--uri|connecturi|connect()()• Returneaza:

– Valoarea 0 = succes– Valoarea –1 = eroare

• EISCONN• ETIMEDOUT• ECONNREFUSED• ENETUNREACH• EADDRINUSE• EINPROGRESS• EADDRNOTAVAIL• EAFNOSUPPORT

Page 35: Computer Networks. Internet programming basics

ReteleRetele de de calculatoarecalculatoare

SabinSabin--CorneliuCorneliu BuragaBuraga 2006/2007 2006/2007 –– www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// [[3535]]

I/O I/O TCP|readTCP|read()()• Apelul este blocant in mod normal, read() returneaza doar cind exista date disponibile

• Citirea de la un socket TCP poate returnamai putini octeti decit numarul maxim dorit

• Trebuie sa fim pregatiti sa citim cite 1 byte la un moment dat!

• Daca partenerul a inchis conexiunea si nu mai suntdate de primit, se returneaza 0 (EOF)

• Erori: EINTR – un semnal a intrerupt citirea, EIO – eroare I/O, EWOULDBLOCK – socket-ul nu are date intr-o citire neblocantaint read ( int sockfd, void *buf, int max );

Page 36: Computer Networks. Internet programming basics

ReteleRetele de de calculatoarecalculatoare

SabinSabin--CorneliuCorneliu BuragaBuraga 2006/2007 2006/2007 –– www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// [[3636]]

I/O I/O TCP|writeTCP|write()()• Apelul este blocant in mod normal• Pentru un socket neblocant, write() poate scrie mai putin de num octeti

• Erori: – EPIPE – scriere la un socket neconectat– EWOULDBLOCK – nu se pot accepta date

fara blocare, insa operatiunea este setataca fiind neblocanta

int write ( int sockfd, void *buf, int num );

Page 37: Computer Networks. Internet programming basics

ReteleRetele de de calculatoarecalculatoare

SabinSabin--CorneliuCorneliu BuragaBuraga 2006/2007 2006/2007 –– www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// [[3737]]

I/O I/O TCP|exempluTCP|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 */

/* trimite cererea */write (sd, cerere, strlen (cerere));

/* asteapta raspunsul */while ((n = read (sd, pbuf, lung)) > 0) {

pbuf += n;lung -= n;

} • Comunicarea dintre client si server

Page 38: Computer Networks. Internet programming basics

ReteleRetele de de calculatoarecalculatoare

SabinSabin--CorneliuCorneliu BuragaBuraga 2006/2007 2006/2007 –– www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// [[3838]]

InchidereaInchiderea conexiunii|closeconexiunii|close()()• Terminarea “gratioasa” a conexiunii• Dealocarea memoriei alocate socket-ului

– 3-way handshake pentru inchiderea conexiunii– Pentru procese care partajeaza acelasi socket,

se decrementeaza numarul de referinte la acel socket; cind ajunge la 0, socket-ul este dealocat

• Probleme– Serverul nu poate termina conexiunea,

nu stie daca si cind clientul nu va mai trimite si alte cereri– Clientul nu poate sti daca datele au ajuns la server

int close ( int sockfd );

Page 39: Computer Networks. Internet programming basics

ReteleRetele de de calculatoarecalculatoare

SabinSabin--CorneliuCorneliu BuragaBuraga 2006/2007 2006/2007 –– www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// [[3939]]

InchidereaInchiderea conexiunii|shutdownconexiunii|shutdown()()• Inchiderea unidirectionala

– Cind un client termina de trimis cererile, poate apelashutdown() pentru a specifica faptul ca nu va mai trimitedate pe socket, fara a dealoca socket-ul

– Serverul va primi EOF si, dupa expedierea catre client a ultimului raspuns, va putea inchide conexiunea

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)

Page 40: Computer Networks. Internet programming basics

ReteleRetele de de calculatoarecalculatoare

SabinSabin--CorneliuCorneliu BuragaBuraga 2006/2007 2006/2007 –– www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// [[4040]]

Metaphor for Good RelationshipsMetaphor for Good RelationshipsCopyright Dr. LauraCopyright Dr. Laura’’s Network Programming Corp.s Network Programming Corp.

To succeed in relationships…– you need to establish your own identity.

– you need to be open & accepting.

– you need to establish contacts.

– you need to take things as they come, not as you expect them.

– you need to handle problems as they arise.

bind()

accept()

connect()

check for errors

read might return 1 byte

Page 41: Computer Networks. Internet programming basics

ReteleRetele de de calculatoarecalculatoare

SabinSabin--CorneliuCorneliu BuragaBuraga 2006/2007 2006/2007 –– www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// [[4141]]

Client/server Client/server TCP|serverTCP|server• Modelul unui server TCP iterativ

– Creare socket pentru tratarea conexiunilor cu clientii: socket()– Pregatirea structurilor de date (sockaddr_in) – Atasarea socket-ului la adresa locala (port): bind()– Pregatirea socket-ului pentru ascultarea portului

in vederea stabilirii conexiunii cu clientii: listen()– Asteptarea realizarii unei conexiuni cu un anumit client

(deschidere pasiva): accept()– Procesarea cererilor clientului, folosindu-se socket-ul

returnat de accept(): succesiune de read()/write()– Inchiderea (directionata) a conexiunii cu clientul:

close(), shutdown()

Page 42: Computer Networks. Internet programming basics

ReteleRetele de de calculatoarecalculatoare

SabinSabin--CorneliuCorneliu BuragaBuraga 2006/2007 2006/2007 –– www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// [[4242]]

Client/server Client/server TCP|clientTCP|client• Modelul unui client TCP iterativ

– Creare socket pentru conectarea la server: socket()– Pregatirea structurilor de date (sockaddr_in) – Atasarea socket-ului: bind() – optional– Conectarea la server (deschidere activa): connect()– Solicitarea de servicii si receptionarea rezultatelor

trimise de server: succesiune de write()/read()– Inchiderea (directionata) a conexiunii cu serverul:

close(), shutdown()

Page 43: Computer Networks. Internet programming basics

ReteleRetele de de calculatoarecalculatoare

SabinSabin--CorneliuCorneliu BuragaBuraga 2006/2007 2006/2007 –– www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// [[4343]]

Client/server TCPClient/server TCP

Page 44: Computer Networks. Internet programming basics

ReteleRetele de de calculatoarecalculatoare

SabinSabin--CorneliuCorneliu BuragaBuraga 2006/2007 2006/2007 –– www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// [[4444]]

Client/server TCPClient/server TCP• Comunicarea orientata-conexiune

dintre server si client

Page 45: Computer Networks. Internet programming basics

ReteleRetele de de calculatoarecalculatoare

SabinSabin--CorneliuCorneliu BuragaBuraga 2006/2007 2006/2007 –– www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// [[4545]]

RezumatRezumat• Modelul client/server• API pentru programarea in retea• Socket-uri BSD

– Caracterizare– Creare– Primitive

• Modelul client/server TCP

Page 46: Computer Networks. Internet programming basics

ReteleRetele de de calculatoarecalculatoare

SabinSabin--CorneliuCorneliu BuragaBuraga 2006/2007 2006/2007 –– www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// [[4646]]

Intrebari?