SlideShare ist ein Scribd-Unternehmen logo
1 von 46
Downloaden Sie, um offline zu lesen
Retele de calculatoare




             Retele de calculatoare
            Programarea in retea – II
                 Sabin-Corneliu Buraga
                     busaco@infoiasi.ro
              http://www.infoiasi.ro/~busaco


Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [1]
Retele de calculatoare



                                                      Cuprins

          • Modelul client/server UDP
          • Primitive I/O folositoare
          • Aspecte mai avansate
            de programare Internet
          • Critici aduse API-ului socket
Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [2]
Retele de calculatoare



                               Client/server UDP
  • Pentru socket() se va folosi SOCK_DGRAM
    in loc de SOCK_STREAM
  • Apelurile listen(), accept(), connect()
    nu vor mai fi utilizate in mod uzual
  • Pentru citire/scriere de datagrame,
    se pot folosi sendto() si recvfrom(), respectiv
  • Se pot utiliza, mai general, send() si recv()
  • Nimeni nu garanteaza ca datele expediate
    au ajuns la destinatar sau ca nu sint duplicate!

Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [3]
Retele de calculatoare



                               Client/server UDP




Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [4]
Retele de calculatoare



                               Client/server UDP
• Socket-urile UDP pot fi conectate: clientul poate folosi
  connect() pentru a specifica adresa (IP, port)
  a punctului terminal (serverul) – pseudo-conexiuni
    – Convenabil pentru transmiterea mai multor datagrame
      la acelasi server, fara a mai specifica adresa serverului
      pentru fiecare datagrama in parte
    – Pentru UDP, connect() va retine doar informatiile despre
      punctul terminal, fara a se initia nici un schimb de date
    – Desi connect() raporteaza succes, nu inseamna ca adresa
      punctului terminal e valida sau serverul este disponibil
• Se poate utiliza shutdown() pentru a opri directionat
  transmiterea de date, dar nu se va trimite
  nici un mesaj partenerului de conversatie
• Primitiva connect() poate fi apelata
  si pentru a elimina o pseudo-conexiune
Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [5]
Retele de calculatoare



                              Alte primitive|I/O
  • readv()/writev()
     – Mai generale ca read()/write(),
       ofera posibilitatea de a transmite date aflate
       in zone necontigue de memorie
  • recv()/send()
     – Ofera modalitati de controlare a transmisiei
       (e.g., receptare/trimitere de packete
       “out-of-band”, “urgent data”, fara rutare locala,…)
  • recvmsg()/sendmsg()
     – Receptioneaza/transmite mesaje,
       extragindu-le din structura msghdr

Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [6]
Retele de calculatoare



                 Alte primitive|informatii
• getsockname()
    – Returneaza numele curent al unui socket (local)
      • adresa la care este atasat
    int getsockname( int sockfd,
                           struct sockaddr *name,
                           socklen_t *namelen );
• getpeername()
    – Returneaza informatii despre celalalt capat al conexiunii
    int getpeername( int sockfd,
                         struct sockaddr *name,
                         socklen_t *namelen );

Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [7]
Retele de calculatoare



              Programare retea avansata

   • Optiuni atasate socket-urilor
       – getsockopt() si setsockopt()
   •   I/O bazate pe semnale
   •   Multiplexare I/O
   •   Alternative la modelul client/server clasic
       Date trimise in regim out-of-band
   •


Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [8]
Retele de calculatoare



                                 Primitive|optiuni
  • Optiuni atasate socket-urilor
      – Atribute utilizate pentru consultarea
        sau modificarea unui comportament,
        general ori specific unui protocol,
        pentru unele (tipuri de) socket-uri
      – Tipuri de valori:
          • Booleene (flag-uri)
          • Mai “complexe”:
            int, timeval, in_addr, sock_addr etc.

Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [9]
Retele de calculatoare



                                 Primitive|optiuni
  • Consultarea optiunilor                                         Numele,
                                                                  val. si lung.
  int getsockopt ( int sockfd,                                      optiunii
                   int level,
                   int optname,
                   void *opval,
                   socklen_t *optlen );

  level – indica daca optiunea este una generala ori
    specifica unui protocol
Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [10]
Retele de calculatoare



                                 Primitive|optiuni
• Setarea optiunilor
int setsockopt ( int sockfd,
                 int level,
                 int optname,
                 void *opval,
                 socklen_t optlen );
   – Returneaza 0 = succes, –1 = eroare:
     EBADF, ENOTSOCK, ENOPROTOOPT, EFAULT


Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [11]
Retele de calculatoare



                                 Primitive|optiuni
  • Optiuni generale
      – Independente de protocol
      – Unele suportate doar de anumite tipuri de
        socket-uri (SOCK_DGRAM, SOCK_STREAM)
          SO_BROADCAST
          SO_DONTROUTE
          SO_ERROR
          SO_KEEPALIVE
          SO_LINGER
          SO_RCVBUF, SO_SNDBUF
          SO_REUSEADDR
Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [12]
Retele de calculatoare



                                 Primitive|optiuni
• SO_BROADCAST (boolean)
   – Activeaza/dezactiveaza trimiterea de date
     in regim broadcast
   – Nivelul legatura de data folosit
     trebuie sa suporte broadcasting-ul
   – Utilizata doar pentru SOCK_DGRAM
   – Previne anumite aplicatii sa nu trimita
     in mod neadecvat broadcast-uri
• SO_DONTROUTE (boolean)
   – Utilizat de daemonii de rutare
   – Dezactiveaza/activeaza rutarea pachetelor de date
Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [13]
Retele de calculatoare



                                 Primitive|optiuni
• SO_ERROR (int)
   – Indica eroarea survenita (similara lui errno)
   – Poate fi doar citita, nu setata
• SO_KEEPALIVE (boolean)
   – Folosita pentru SOCK_STREAM
   – Se va trimite o informatie de proba
     celuilalt punct terminal daca nu s-a realizat
     schimb de date timp indelungat
   – Utilizata de TCP (e.g., telnet): permite proceselor
     sa determine daca procesul/gazda cealalta a picat
Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [14]
Retele de calculatoare



                                 Primitive|optiuni
• SO_LINGER (struct linger)
  – Controleaza daca si dupa cit timp un apel
    de inchidere a conexiunii va astepta
    confirmari (ACK-uri) de la punctul terminal
  – Folosita doar pentru socket-uri orientate-conexiune
    pentru a ne asigura ca un apel close()
    nu va returna imediat
  – Valorile vor fi de tipul:
struct linger {
     int l_onoff;              /* 0 = off */
     int l_linger;             /* timpul in secunde */
};
Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [15]
Retele de calculatoare



                                 Primitive|optiuni
• SO_RCVBUF/SO_SNDBUF (int)
   – Modifica dimensiunile buffer-elor de receptionare
     sau de trimitere a datelor
   – Utilizate pentru SOCK_DGRAM si SOCK_STREAM
   – Pentru TCP, se controleaza dimensiunea ferestrei glisante
     • trebuie stabilita inainte de stabilirea conexiunii
• SO_REUSEADDR (boolean)
   – Permite atasarea la o adresa (port) deja in uz
   – Folosita pentru servere tranziente pentru ca un socket pasiv
     sa poata folosi un port deja utilizat de alte procese
   – Poate fi utila cind dorim sa avem servere separate pentru
     acelasi serviciu (folosind eventual alte interfete/adrese IP)
   – Exemplu: servere Web virtuale
Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [16]
Retele de calculatoare



                                 Primitive|optiuni
• Optiuni specifice protocolului IP
   – IP_TOS permite setarea cimpului “Type Of Service”
     (e.g., ICMP) din antetul IP
   – IP_TTL permite setarea cimpului “Time To Live”
     din antetul IP

   – Exista si multe alte optiuni pentru IPv6




Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [17]
Retele de calculatoare



                                 Primitive|optiuni
• Optiuni specifice protocolului TCP
   – TCP_KEEPALIVE seteaza timpul de asteptare
     daca SO_KEEPALIVE este activat
   – TCP_MAXSEG stabileste lungimea maxima
     a unui segment (nu toate implementarile permit
     modificarea acestei valori de catre aplicatie)
   – TCP_NODELAY seteaza dezactivarea algoritmului
     Nagle (reducerea numarului de pachete de
     dimensiuni mici intr-o retea WAN; TCP va trimite
     intotdeauna pachete de marime maxima,
     daca este posibil) – utilizata pentru generatori de
     pachete mici (e.g., clienti interactivi precum telnet)
Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [18]
Retele de calculatoare



                                 Primitive|optiuni
• Exemplu de utilizare:
int valoare = 1;
if (setsockopt (sd, /* desc. de socket */
                SOL_SOCKET,
                SO_REUSEADDR,
                (char *)&valoare,
                sizeof (valoare)) < 0) {
  perror (“setsockopt”);
  exit (1);
}


Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [19]
Retele de calculatoare



                                                                  I/O
 • Problema:
     – Sa se trimita un semnal procesului
       atunci cind se intimpla “ceva” la un socket
 • Solutie:
     – Indicam nucleului sa trimita semnalul SIGIO
       la fiecare eveniment I/O asupra
       unui descriptor de socket
     – Functia de tratare a semnalului
       trebuie sa determine cauzele aparitiei
       si sa realizeze actiunea dorita
Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [20]
Retele de calculatoare



                                                  I/O|UDP
 • Semnalul SIGIO apare cind:
     – Se receptioneaza o datagrama
     – Are loc o eroare asincrona
        • Exemplu:
          eroare ICMP (net unreachable, invalid address)
 • Putem permite proceselor sa realizeze alte
   activitati si sa monitorizeze transferurile UDP

 • Exemplu: “stampilarea” datagramelor

Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [21]
Retele de calculatoare



                                                   I/O|TCP
 • Conditii de aparitie a SIGIO:
     – Conexiunea a fost complet stabilita
     – O cerere de deconectare a fost initiata
     – Cererea de deconectare a fost realizata completa
     – shutdown() pentru o directie a comunicatiei
     – Au aparut date de la celalalt punct terminal
     – Datele au fost trimise
     – Eroare asincrona

 • Utilizat pentru comunicatii asincrone
Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [22]
Retele de calculatoare



                                Multiplexarea I/O
• Posibilitatea de a monitoriza
  mai multi descriptori I/O
   – Un client TCP generic (e.g., telnet)
   – Un client interactiv (e.g., ftp, scp, browser Web,…)
   – Un server care poate manipula
     mai multe protocoale (TCP si UDP) simultan
   – Rezolvarea unor situatii neasteptate
     (i.e. caderea unui server in mijlocul comunicarii)
• Exemplu: datele citite de la intrarea standard
  trebuie scrise la un socket, iar datele
  receptionate prin retea trebuie afisate
  la iesirea standard
Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [23]
Retele de calculatoare



               Multiplexarea I/O|solutii
   1. Utilizarea mecanismului neblocant
      folosind primitivele fnctl() / ioctl()
   2. Folosirea alarm() pentru a intrerupe
      apelurile de sistem lente
   3. Utilizarea unor procese/thread-uri multiple
   4. Folosirea unor primitive care suporta
      verificarea existentei datelor de intrare
      de la descriptori de citire multipli:
      select() si poll()

Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [24]
Retele de calculatoare



               Multiplexarea I/O|solutii
   • Utilizarea apelului fnctl()
       – Se seteaza apelurile I/O ca neblocante
          int flags;
          flags = fcntl ( sd, F_GETFL, 0 );
          fcntl ( sd, F_SETFL,
                          flags | O_NONBLOCK );
       – Orice citire (cu read() ori alt apel) va returna
         eroare si errno va fi setat pe EWOULDBLOCK


   • In loc de fnctl() se poate folosi si ioctl()

Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [25]
Retele de calculatoare



               Multiplexarea I/O|solutii
• Utilizarea fnctl() – exemplu:
while (!nu_am_terminat) {
  if ((n = read (0,…) < 0))        /* citire STDIN */
        if (errno != EWOULDBLOCK){ /* eroare */ }
   else
       write (tcpsock,…);          /* scriere pe retea */
    if ( (n = read (tcpsock,…) < 0))    /* citire retea */
            if (errno != EWOULDBLOCK) { /* eroare */ }
       else
          write (1,…);                  /* scriere STDOUT */
}
Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [26]
Retele de calculatoare



               Multiplexarea I/O|solutii
• Utilizarea alarmelor
   signal (SIGALRM, alarma);
   alarm (MAX_TIME);
   read (0,…);
                              Functie scrisa
   ...
                             de programator
   signal (SIGALRM, alarma);
   alarm (MAX_TIME);
   read (tcpsock,…);
   ...
Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [27]
Retele de calculatoare



                                Multiplexarea I/O

       • Probleme care apar:
           – Folosind apeluri neblocante,
             se utilizeaza intens procesorul
           – Pentru alarm(), care este valoarea
             optima a constantei MAX_TIME?



Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [28]
Retele de calculatoare



              Multiplexarea I/O|select()
• Permite utilizarea apelurilor blocante pentru un set
  de descriptori (fisiere, pipe-uri, socket-uri,…)
int select (int nfds1,                           Valoarea
                 fd_set *readfds,               maxima a
                                              descript. plus 1
                 fd_set *writefds,
                 fd_set *exceptfds,
                 struct timeval *timeout);
 Multimea descriptorilor de citire,
       scriere si exceptie                             Timpul de
                                                       asteptare

Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [29]
Retele de calculatoare



              Multiplexarea I/O|select()
• Pentru timpul de asteptare se foloseste
  structura definita in sys/time.h:
  struct timeval {
    long tv_sec;                    /* secunde */
    long tv_usec;              /* microsecunde */
  }
• Manipularea elementelor multimii de descriptori
  (tipul fd_set):
void FD_ZERO (fd_set *fdset);
void FD_SET       (int fd, fd_set *fdset);
void FD_CLR       (int fd, fd_set *fdset);
int FD_ISSET (int fd, fd_set *fdset);
Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [30]
Retele de calculatoare



              Multiplexarea I/O|select()
• Returneaza:
   – Numarul descriptorilor pregatiti pentru o operatiune
     de citire, scriere sau exceptie
   – Valoarea 0 – timpul s-a scurs, nici un descriptor nu este gata
   – Valoarea –1 in caz de eroare
• Utilizarea lui select()
   – Declararea unei variabile de tip fd_set
   – Initializarea multimii cu FD_ZERO()
   – Adaugarea cu FD_SET() a fiecarui descriptor dorit
     a fi monitorizat
   – Apelarea primitivei select()
   – La intoarcerea cu succes, verificarea cu FD_ISSET()
     a descriptorilor pregatiti pentru I/O
Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [31]
Retele de calculatoare



              Multiplexarea I/O|select()
• Un descriptor de socket e gata de citire daca:
   – Exista octeti receptionati in buffer-ul de intrare
     (read() returneaza >0)
   – O conexiune TCP a receptionat FIN
     (read() returneaza 0)
   – Socket-ul e socket de ascultare si nr. de conexiuni
     complete este nenul (se poate utiliza accept())
   – A aparut o eroare la socket (read() returneaza –1,
     cu errno setat) – erorile pot fi tratate
     via getsockopt() cu optiunea SO_ERROR

Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [32]
Retele de calculatoare



              Multiplexarea I/O|select()
• Un descriptor de socket e gata de scriere daca:
   – Exista un numar de octeti disponibili
     in buffer-ul de scriere (write() returneaza >0)
   – Conexiunea in sensul scrierii este inchisa
     (write() va genera SIGPIPE)
   – A aparut o eroare de scriere (write() returneaza –1,
     cu errno setat) – erorile pot fi tratate
     via getsockopt() cu optiunea SO_ERROR
• Un descriptor de socket este gata
  de exceptie daca:
   – Exista date out-of-band sau socket-ul este marcat
     ca out-of-band – vezi urmatoarele slide-uri
Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [33]
Retele de calculatoare



              Multiplexarea I/O|select()




                                          Mai multi clienti pot face
                                         cereri la acelasi punct final
                                                de comunicare

Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [34]
Retele de calculatoare



                                               Alternative
  • Servere concurente pre-forked
      – Se creeaza un numar de procese copil imediat
        la initializare, fiecare proces liber interactionind
        cu un anumit client
  • Servere concurente pre-threaded
      – Ca mai sus, dar se folosesc thread-uri (fire de executie)
        in locul proceselor (vezi POSIX threads – pthread.h)
      – Exemplu: serverul Apache
        (initial, se creeaza 6 instante httpd)
  • Probleme:
      – Numarul de clienti mai mare
        decit numarul de procese/thread-uri
      – Numarul de procese/thread-uri prea mare
        fata de numarul de clienti
Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [35]
Retele de calculatoare



                                                Out of band
 • TCP (si alte protocoale de transport)
   ofera un mecanism pentru transmiterea
   cu prioritate ridicata a anumitor date
 • Astfel, putem avea doua fluxuri de date:
                              Date normale

           TCP                                              TCP
          PORT A                                           PORT B

                               Date speciale

Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [36]
Retele de calculatoare



                                                Out of band
 • Se utilizeaza bitul URG setat in antetul TCP
 • Antetul TCP contine un cimp indicind locatia
   datelor urgente ce trebuie trimise
 • Trimiterea datelor OOB:
     – Pentru a expedia un octet urgent
       intr-un flux de date putem utiliza send():
       send ( sd, buff, 1, MSG_OOB );
 • Receptionarea datelor OOB:
     – Se genereaza semnalul SIGURG
     – Apelul select() va modifica
       lista descriptorilor de exceptie
Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [37]
Retele de calculatoare



                                                Out of band
 • Exemplu de trimitere a unui octet OOB
                                      Buffer-ul de trimitere TCP
     1                    N


  Primul octet      Ultimul octet
                                     send ( sd, “s”, 1, MSG_OOB );
   de trimis          de trimis


     1                 N*            Pointer urgent TCP


                   Caracter OOB
                                                  Transmiterea unui
                                                     caracter OOB
Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [38]
Retele de calculatoare



                                                Out of band
 • Citirea datelor OOB:
     – Se utilizeaza recv(), setind MSG_OOB
     – Se foloseste monitorizarea out-of-band-mark
       pentru conexiune: sockatmark()
 • Utilizari:
     – Modalitate de comunicare celuilalt punct terminal
       a unei conditii de exceptie chiar si in cazul
       cind controlul fluxului a oprit emitatorul
     – Pentru a detecta timpuriu erori de comunicare
       intre client si server (heart-beat)
Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [39]
Retele de calculatoare



                                                Out of band

 • Erori posibile
     – Se asteapta citirea de date OOB, dar ele nu au
       fost inca trimise – se returneaza EINVAL
     – Procesul a fost notificat ca va primi date OOB
       (via select() sau SIGURG), dar ele inca
       nu au ajuns – se returneaza EWOULDBLOCK
     – Se incearca sa se citeasca un acelasi octet OOB
       de mai multe ori – se returneaza EINVAL


Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [40]
Retele de calculatoare



                                                Out of band
 • Tratare OOB prin SIGURG
 ...
 sd = listen();
 cl = accept (sd, NULL, NULL);
 signal (SIGURG, fct_urg);
 fnctl (cl, F_SETOWN, getpid());
 while (1) {
   if ((n = read (cl, buf, sizeof (buf) - 1)) == 0)
     { /* EOF */ }
   buf[n] = ‘0’;
   printf (“am citit %d octeti normali: %s”,
     n, buf);
 }
 void fct_urg (int sig) { /* trateaza SIGURG */
   n = recv (cl, buf, sizeof (buf) - 1, MSG_OOB);
   buf[n] = ‘0’;
   printf (“OOB %d: %s”, n, buf);
 }
Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [41]
Retele de calculatoare



                                                          Critici
• API-ul bazat pe socket-uri BSD
  are o serie de limitari:
   – Incurajeaza programarea cu erori
   – Are o complexitate ridicata, deoarece a fost
     proiectata sa suporte familii de protocoale multiple
     (dar rar folosite in practica)
   – Nu este portabila (unele apeluri/tipuri au alte
     denumiri/reprezentari pe alte platforme;
     numele fisierelor-antet .h depind de sistem)
       • Exemplu: la WinSock descriptorii de socket sunt pointeri,
         in contrast cu implementarile Unix care folosesc intregi
Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [42]
Retele de calculatoare
  • Exemplu continind erori
  1 #include <sys/types.h>
                                                              Critici
  2 #include <sys/socket.h>
  3 const int PORT_NUM = 10000;
                                                      neinitializarea
  4 int echo_server () {
  5 struct sockaddr_in addr;                       tuturor membrilor
  6 int addr_len;
  7 char buf[BUFSIZ];
  8 int cd;                                                       neinitializat
  9 int sd = socket (PF_UNIX, SOCK_DGRAM, 0);
                                                                 htons() lipseste
  10 if (sd == -1) return -1;
  11 addr.sin_family = AF_INET;
  12 addr.sin_port = PORT_NUM;
  13 addr.sin_addr.addr = INADDR_ANY;
  14 if (bind (sd, (struct sockaddr *) &addr, sizeof addr) == -1) return -1;
  15 if (cd = accept (sd, (struct sockaddr *) &addr, &addr_len) != -1) {
  16 int n;
  17 while (n = read (sd, buf, sizeof (buf)) > 0)
  18 write (cd, buf, n);
  19 close (cd);
  20 }                                   PF_UNIX incompatibil cu AF_INET!
  21 }                                                               listen() omis!
Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [43]
Retele de calculatoare



                                                          Critici
• Exemplul nu este portabil, deoarece la WinSock
  socket-urile sunt de tip SOCKET si nu int (mai mult,
  erorile sunt indicate via macro-ul nestandardizat
  INVALID_SOCKET_HANDLE)
• accept() e apelat pentru un socket de tip invalid,
  insa compilatorul nu semnaleaza eroarea
• Erori in liniile 15 si 17 privitoare la precedenta
  operatorilor (greseala comuna in C/C++)
• In linia 17, read() foloseste socket-ul pasiv
  ⇒ erori bizare in momentul rularii
• Pot aparea posibile erori de scriere: nu se verifica
  nr. bytes-urilor trimisi in retea via write() – linia 18
Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [44]
Retele de calculatoare



                                                    Rezumat

        • Modelul client/server UDP
        • Primitive I/O folositoare
        • Aspecte mai avansate
          de programare Internet
        • Critici aduse API-ului socket

Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [45]
Retele de calculatoare




                         Intrebari?




Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [46]

Weitere ähnliche Inhalte

Was ist angesagt? (6)

Computer Networks. TCP/IP
Computer Networks. TCP/IPComputer Networks. TCP/IP
Computer Networks. TCP/IP
 
Computer Networks. Domain Name System
Computer Networks. Domain Name SystemComputer Networks. Domain Name System
Computer Networks. Domain Name System
 
Computer Networks. Main concepts
Computer Networks. Main conceptsComputer Networks. Main concepts
Computer Networks. Main concepts
 
Computer Networks.Protocols
Computer Networks.ProtocolsComputer Networks.Protocols
Computer Networks.Protocols
 
Computer Networks. P2P
Computer Networks. P2PComputer Networks. P2P
Computer Networks. P2P
 
Computer Networks. Security: monitoring & testing
Computer Networks. Security: monitoring & testingComputer Networks. Security: monitoring & testing
Computer Networks. Security: monitoring & testing
 

Andere mochten auch (15)

Computer Networks. Retrospective & perspective
Computer Networks. Retrospective & perspectiveComputer Networks. Retrospective & perspective
Computer Networks. Retrospective & perspective
 
Koblenz[1]
Koblenz[1]Koblenz[1]
Koblenz[1]
 
eHealth_Bulgaria
eHealth_BulgariaeHealth_Bulgaria
eHealth_Bulgaria
 
Presentación del examen DEA
Presentación del examen DEAPresentación del examen DEA
Presentación del examen DEA
 
Germany Food德國食物[1]
Germany Food德國食物[1]Germany Food德國食物[1]
Germany Food德國食物[1]
 
Germany food
Germany   foodGermany   food
Germany food
 
巴洛克建築
巴洛克建築巴洛克建築
巴洛克建築
 
Megadescubrimiento
MegadescubrimientoMegadescubrimiento
Megadescubrimiento
 
El papel de las Sociedades de Garantía Recíproca en la financiación de las pymes
El papel de las Sociedades de Garantía Recíproca en la financiación de las pymesEl papel de las Sociedades de Garantía Recíproca en la financiación de las pymes
El papel de las Sociedades de Garantía Recíproca en la financiación de las pymes
 
Germany Food德國食物[1]
Germany Food德國食物[1]Germany Food德國食物[1]
Germany Food德國食物[1]
 
Sellyouself
SellyouselfSellyouself
Sellyouself
 
Paris巴黎
Paris巴黎Paris巴黎
Paris巴黎
 
French Food
French    FoodFrench    Food
French Food
 
Te Paso El BalóN
Te Paso El BalóNTe Paso El BalóN
Te Paso El BalóN
 
Secuestrador.Pps
Secuestrador.PpsSecuestrador.Pps
Secuestrador.Pps
 

Mehr von Sabin Buraga

Mehr von Sabin Buraga (20)

Web 2020 01/12: World Wide Web – aspecte arhitecturale
Web 2020 01/12: World Wide Web – aspecte arhitecturaleWeb 2020 01/12: World Wide Web – aspecte arhitecturale
Web 2020 01/12: World Wide Web – aspecte arhitecturale
 
Web 2020 02/12: Programare Web – HTTP. Cookie-uri. Sesiuni Web
Web 2020 02/12: Programare Web – HTTP. Cookie-uri. Sesiuni WebWeb 2020 02/12: Programare Web – HTTP. Cookie-uri. Sesiuni Web
Web 2020 02/12: Programare Web – HTTP. Cookie-uri. Sesiuni Web
 
Web 2020 03/12: Programare Web – Arhitectura aplicaţiilor Web. Inginerie Web
Web 2020 03/12: Programare Web – Arhitectura aplicaţiilor Web. Inginerie WebWeb 2020 03/12: Programare Web – Arhitectura aplicaţiilor Web. Inginerie Web
Web 2020 03/12: Programare Web – Arhitectura aplicaţiilor Web. Inginerie Web
 
Web 2020 04/12: Programare Web – Dezvoltarea aplicaţiilor Web în PHP
Web 2020 04/12: Programare Web – Dezvoltarea aplicaţiilor Web în PHP Web 2020 04/12: Programare Web – Dezvoltarea aplicaţiilor Web în PHP
Web 2020 04/12: Programare Web – Dezvoltarea aplicaţiilor Web în PHP
 
Web 2020 05/12: Modelarea datelor. Familia XML. Extragerea datelor cu XPath. ...
Web 2020 05/12: Modelarea datelor. Familia XML. Extragerea datelor cu XPath. ...Web 2020 05/12: Modelarea datelor. Familia XML. Extragerea datelor cu XPath. ...
Web 2020 05/12: Modelarea datelor. Familia XML. Extragerea datelor cu XPath. ...
 
Web 2020 06/12: Procesarea datelor XML & HTML. Document Object Model
Web 2020 06/12: Procesarea datelor XML & HTML. Document Object ModelWeb 2020 06/12: Procesarea datelor XML & HTML. Document Object Model
Web 2020 06/12: Procesarea datelor XML & HTML. Document Object Model
 
Web 2020 07/12: Procesarea datelor XML & HTML – Simple API for XML. Procesări...
Web 2020 07/12: Procesarea datelor XML & HTML – Simple API for XML. Procesări...Web 2020 07/12: Procesarea datelor XML & HTML – Simple API for XML. Procesări...
Web 2020 07/12: Procesarea datelor XML & HTML – Simple API for XML. Procesări...
 
Web 2020 08/12: Servicii Web. De la arhitecturi orientate spre servicii la SO...
Web 2020 08/12: Servicii Web. De la arhitecturi orientate spre servicii la SO...Web 2020 08/12: Servicii Web. De la arhitecturi orientate spre servicii la SO...
Web 2020 08/12: Servicii Web. De la arhitecturi orientate spre servicii la SO...
 
Web 2020 09/12: Servicii Web. Paradigma REST
Web 2020 09/12: Servicii Web. Paradigma RESTWeb 2020 09/12: Servicii Web. Paradigma REST
Web 2020 09/12: Servicii Web. Paradigma REST
 
Web 2020 10/12: Servicii Web. Micro-servicii. Serverless. Specificarea API-ur...
Web 2020 10/12: Servicii Web. Micro-servicii. Serverless. Specificarea API-ur...Web 2020 10/12: Servicii Web. Micro-servicii. Serverless. Specificarea API-ur...
Web 2020 10/12: Servicii Web. Micro-servicii. Serverless. Specificarea API-ur...
 
Web 2020 11/12: Interacţiune Web asincronă. Aplicaţii Web de tip mash-up. JAM...
Web 2020 11/12: Interacţiune Web asincronă. Aplicaţii Web de tip mash-up. JAM...Web 2020 11/12: Interacţiune Web asincronă. Aplicaţii Web de tip mash-up. JAM...
Web 2020 11/12: Interacţiune Web asincronă. Aplicaţii Web de tip mash-up. JAM...
 
Web 2020 12/12: Securitatea aplicaţiilor Web. Aspecte esenţiale
Web 2020 12/12: Securitatea aplicaţiilor Web. Aspecte esenţialeWeb 2020 12/12: Securitatea aplicaţiilor Web. Aspecte esenţiale
Web 2020 12/12: Securitatea aplicaţiilor Web. Aspecte esenţiale
 
STAW 01/12: Arhitectura aplicaţiilor Web
STAW 01/12: Arhitectura aplicaţiilor WebSTAW 01/12: Arhitectura aplicaţiilor Web
STAW 01/12: Arhitectura aplicaţiilor Web
 
STAW 02/12: Programare Web: Limbajul JavaScript. Aspecte esenţiale
STAW 02/12: Programare Web: Limbajul JavaScript. Aspecte esenţialeSTAW 02/12: Programare Web: Limbajul JavaScript. Aspecte esenţiale
STAW 02/12: Programare Web: Limbajul JavaScript. Aspecte esenţiale
 
STAW 03/12: Programare Web: Limbajul JavaScript. Aspecte moderne: ES6 et al.
STAW 03/12: Programare Web: Limbajul JavaScript. Aspecte moderne: ES6 et al.STAW 03/12: Programare Web: Limbajul JavaScript. Aspecte moderne: ES6 et al.
STAW 03/12: Programare Web: Limbajul JavaScript. Aspecte moderne: ES6 et al.
 
STAW 04/12: Programare Web: Node.js
STAW 04/12: Programare Web: Node.jsSTAW 04/12: Programare Web: Node.js
STAW 04/12: Programare Web: Node.js
 
STAW 05/12: Arhitectura navigatorului Web
STAW 05/12: Arhitectura navigatorului WebSTAW 05/12: Arhitectura navigatorului Web
STAW 05/12: Arhitectura navigatorului Web
 
STAW 06/12: JavaScript în navigatorul Web. De la DOM la Ajax şi mash-up-uri
STAW 06/12: JavaScript în navigatorul Web. De la DOM la Ajax şi mash-up-uriSTAW 06/12: JavaScript în navigatorul Web. De la DOM la Ajax şi mash-up-uri
STAW 06/12: JavaScript în navigatorul Web. De la DOM la Ajax şi mash-up-uri
 
STAW 07/12: Ingineria dezvoltării aplicaţiilor JavaScript
STAW 07/12: Ingineria dezvoltării aplicaţiilor JavaScriptSTAW 07/12: Ingineria dezvoltării aplicaţiilor JavaScript
STAW 07/12: Ingineria dezvoltării aplicaţiilor JavaScript
 
STAW 08/12: Programare Web. Suita de tehnologii HTML5
STAW 08/12: Programare Web. Suita de tehnologii HTML5STAW 08/12: Programare Web. Suita de tehnologii HTML5
STAW 08/12: Programare Web. Suita de tehnologii HTML5
 

Computer Networks. Internet programming (more advanced topics)

  • 1. Retele de calculatoare Retele de calculatoare Programarea in retea – II Sabin-Corneliu Buraga busaco@infoiasi.ro http://www.infoiasi.ro/~busaco Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [1]
  • 2. Retele de calculatoare Cuprins • Modelul client/server UDP • Primitive I/O folositoare • Aspecte mai avansate de programare Internet • Critici aduse API-ului socket Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [2]
  • 3. Retele de calculatoare Client/server UDP • Pentru socket() se va folosi SOCK_DGRAM in loc de SOCK_STREAM • Apelurile listen(), accept(), connect() nu vor mai fi utilizate in mod uzual • Pentru citire/scriere de datagrame, se pot folosi sendto() si recvfrom(), respectiv • Se pot utiliza, mai general, send() si recv() • Nimeni nu garanteaza ca datele expediate au ajuns la destinatar sau ca nu sint duplicate! Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [3]
  • 4. Retele de calculatoare Client/server UDP Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [4]
  • 5. Retele de calculatoare Client/server UDP • Socket-urile UDP pot fi conectate: clientul poate folosi connect() pentru a specifica adresa (IP, port) a punctului terminal (serverul) – pseudo-conexiuni – Convenabil pentru transmiterea mai multor datagrame la acelasi server, fara a mai specifica adresa serverului pentru fiecare datagrama in parte – Pentru UDP, connect() va retine doar informatiile despre punctul terminal, fara a se initia nici un schimb de date – Desi connect() raporteaza succes, nu inseamna ca adresa punctului terminal e valida sau serverul este disponibil • Se poate utiliza shutdown() pentru a opri directionat transmiterea de date, dar nu se va trimite nici un mesaj partenerului de conversatie • Primitiva connect() poate fi apelata si pentru a elimina o pseudo-conexiune Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [5]
  • 6. Retele de calculatoare Alte primitive|I/O • readv()/writev() – Mai generale ca read()/write(), ofera posibilitatea de a transmite date aflate in zone necontigue de memorie • recv()/send() – Ofera modalitati de controlare a transmisiei (e.g., receptare/trimitere de packete “out-of-band”, “urgent data”, fara rutare locala,…) • recvmsg()/sendmsg() – Receptioneaza/transmite mesaje, extragindu-le din structura msghdr Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [6]
  • 7. Retele de calculatoare Alte primitive|informatii • getsockname() – Returneaza numele curent al unui socket (local) • adresa la care este atasat int getsockname( int sockfd, struct sockaddr *name, socklen_t *namelen ); • getpeername() – Returneaza informatii despre celalalt capat al conexiunii int getpeername( int sockfd, struct sockaddr *name, socklen_t *namelen ); Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [7]
  • 8. Retele de calculatoare Programare retea avansata • Optiuni atasate socket-urilor – getsockopt() si setsockopt() • I/O bazate pe semnale • Multiplexare I/O • Alternative la modelul client/server clasic Date trimise in regim out-of-band • Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [8]
  • 9. Retele de calculatoare Primitive|optiuni • Optiuni atasate socket-urilor – Atribute utilizate pentru consultarea sau modificarea unui comportament, general ori specific unui protocol, pentru unele (tipuri de) socket-uri – Tipuri de valori: • Booleene (flag-uri) • Mai “complexe”: int, timeval, in_addr, sock_addr etc. Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [9]
  • 10. Retele de calculatoare Primitive|optiuni • Consultarea optiunilor Numele, val. si lung. int getsockopt ( int sockfd, optiunii int level, int optname, void *opval, socklen_t *optlen ); level – indica daca optiunea este una generala ori specifica unui protocol Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [10]
  • 11. Retele de calculatoare Primitive|optiuni • Setarea optiunilor int setsockopt ( int sockfd, int level, int optname, void *opval, socklen_t optlen ); – Returneaza 0 = succes, –1 = eroare: EBADF, ENOTSOCK, ENOPROTOOPT, EFAULT Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [11]
  • 12. Retele de calculatoare Primitive|optiuni • Optiuni generale – Independente de protocol – Unele suportate doar de anumite tipuri de socket-uri (SOCK_DGRAM, SOCK_STREAM) SO_BROADCAST SO_DONTROUTE SO_ERROR SO_KEEPALIVE SO_LINGER SO_RCVBUF, SO_SNDBUF SO_REUSEADDR Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [12]
  • 13. Retele de calculatoare Primitive|optiuni • SO_BROADCAST (boolean) – Activeaza/dezactiveaza trimiterea de date in regim broadcast – Nivelul legatura de data folosit trebuie sa suporte broadcasting-ul – Utilizata doar pentru SOCK_DGRAM – Previne anumite aplicatii sa nu trimita in mod neadecvat broadcast-uri • SO_DONTROUTE (boolean) – Utilizat de daemonii de rutare – Dezactiveaza/activeaza rutarea pachetelor de date Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [13]
  • 14. Retele de calculatoare Primitive|optiuni • SO_ERROR (int) – Indica eroarea survenita (similara lui errno) – Poate fi doar citita, nu setata • SO_KEEPALIVE (boolean) – Folosita pentru SOCK_STREAM – Se va trimite o informatie de proba celuilalt punct terminal daca nu s-a realizat schimb de date timp indelungat – Utilizata de TCP (e.g., telnet): permite proceselor sa determine daca procesul/gazda cealalta a picat Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [14]
  • 15. Retele de calculatoare Primitive|optiuni • SO_LINGER (struct linger) – Controleaza daca si dupa cit timp un apel de inchidere a conexiunii va astepta confirmari (ACK-uri) de la punctul terminal – Folosita doar pentru socket-uri orientate-conexiune pentru a ne asigura ca un apel close() nu va returna imediat – Valorile vor fi de tipul: struct linger { int l_onoff; /* 0 = off */ int l_linger; /* timpul in secunde */ }; Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [15]
  • 16. Retele de calculatoare Primitive|optiuni • SO_RCVBUF/SO_SNDBUF (int) – Modifica dimensiunile buffer-elor de receptionare sau de trimitere a datelor – Utilizate pentru SOCK_DGRAM si SOCK_STREAM – Pentru TCP, se controleaza dimensiunea ferestrei glisante • trebuie stabilita inainte de stabilirea conexiunii • SO_REUSEADDR (boolean) – Permite atasarea la o adresa (port) deja in uz – Folosita pentru servere tranziente pentru ca un socket pasiv sa poata folosi un port deja utilizat de alte procese – Poate fi utila cind dorim sa avem servere separate pentru acelasi serviciu (folosind eventual alte interfete/adrese IP) – Exemplu: servere Web virtuale Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [16]
  • 17. Retele de calculatoare Primitive|optiuni • Optiuni specifice protocolului IP – IP_TOS permite setarea cimpului “Type Of Service” (e.g., ICMP) din antetul IP – IP_TTL permite setarea cimpului “Time To Live” din antetul IP – Exista si multe alte optiuni pentru IPv6 Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [17]
  • 18. Retele de calculatoare Primitive|optiuni • Optiuni specifice protocolului TCP – TCP_KEEPALIVE seteaza timpul de asteptare daca SO_KEEPALIVE este activat – TCP_MAXSEG stabileste lungimea maxima a unui segment (nu toate implementarile permit modificarea acestei valori de catre aplicatie) – TCP_NODELAY seteaza dezactivarea algoritmului Nagle (reducerea numarului de pachete de dimensiuni mici intr-o retea WAN; TCP va trimite intotdeauna pachete de marime maxima, daca este posibil) – utilizata pentru generatori de pachete mici (e.g., clienti interactivi precum telnet) Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [18]
  • 19. Retele de calculatoare Primitive|optiuni • Exemplu de utilizare: int valoare = 1; if (setsockopt (sd, /* desc. de socket */ SOL_SOCKET, SO_REUSEADDR, (char *)&valoare, sizeof (valoare)) < 0) { perror (“setsockopt”); exit (1); } Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [19]
  • 20. Retele de calculatoare I/O • Problema: – Sa se trimita un semnal procesului atunci cind se intimpla “ceva” la un socket • Solutie: – Indicam nucleului sa trimita semnalul SIGIO la fiecare eveniment I/O asupra unui descriptor de socket – Functia de tratare a semnalului trebuie sa determine cauzele aparitiei si sa realizeze actiunea dorita Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [20]
  • 21. Retele de calculatoare I/O|UDP • Semnalul SIGIO apare cind: – Se receptioneaza o datagrama – Are loc o eroare asincrona • Exemplu: eroare ICMP (net unreachable, invalid address) • Putem permite proceselor sa realizeze alte activitati si sa monitorizeze transferurile UDP • Exemplu: “stampilarea” datagramelor Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [21]
  • 22. Retele de calculatoare I/O|TCP • Conditii de aparitie a SIGIO: – Conexiunea a fost complet stabilita – O cerere de deconectare a fost initiata – Cererea de deconectare a fost realizata completa – shutdown() pentru o directie a comunicatiei – Au aparut date de la celalalt punct terminal – Datele au fost trimise – Eroare asincrona • Utilizat pentru comunicatii asincrone Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [22]
  • 23. Retele de calculatoare Multiplexarea I/O • Posibilitatea de a monitoriza mai multi descriptori I/O – Un client TCP generic (e.g., telnet) – Un client interactiv (e.g., ftp, scp, browser Web,…) – Un server care poate manipula mai multe protocoale (TCP si UDP) simultan – Rezolvarea unor situatii neasteptate (i.e. caderea unui server in mijlocul comunicarii) • Exemplu: datele citite de la intrarea standard trebuie scrise la un socket, iar datele receptionate prin retea trebuie afisate la iesirea standard Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [23]
  • 24. Retele de calculatoare Multiplexarea I/O|solutii 1. Utilizarea mecanismului neblocant folosind primitivele fnctl() / ioctl() 2. Folosirea alarm() pentru a intrerupe apelurile de sistem lente 3. Utilizarea unor procese/thread-uri multiple 4. Folosirea unor primitive care suporta verificarea existentei datelor de intrare de la descriptori de citire multipli: select() si poll() Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [24]
  • 25. Retele de calculatoare Multiplexarea I/O|solutii • Utilizarea apelului fnctl() – Se seteaza apelurile I/O ca neblocante int flags; flags = fcntl ( sd, F_GETFL, 0 ); fcntl ( sd, F_SETFL, flags | O_NONBLOCK ); – Orice citire (cu read() ori alt apel) va returna eroare si errno va fi setat pe EWOULDBLOCK • In loc de fnctl() se poate folosi si ioctl() Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [25]
  • 26. Retele de calculatoare Multiplexarea I/O|solutii • Utilizarea fnctl() – exemplu: while (!nu_am_terminat) { if ((n = read (0,…) < 0)) /* citire STDIN */ if (errno != EWOULDBLOCK){ /* eroare */ } else write (tcpsock,…); /* scriere pe retea */ if ( (n = read (tcpsock,…) < 0)) /* citire retea */ if (errno != EWOULDBLOCK) { /* eroare */ } else write (1,…); /* scriere STDOUT */ } Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [26]
  • 27. Retele de calculatoare Multiplexarea I/O|solutii • Utilizarea alarmelor signal (SIGALRM, alarma); alarm (MAX_TIME); read (0,…); Functie scrisa ... de programator signal (SIGALRM, alarma); alarm (MAX_TIME); read (tcpsock,…); ... Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [27]
  • 28. Retele de calculatoare Multiplexarea I/O • Probleme care apar: – Folosind apeluri neblocante, se utilizeaza intens procesorul – Pentru alarm(), care este valoarea optima a constantei MAX_TIME? Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [28]
  • 29. Retele de calculatoare Multiplexarea I/O|select() • Permite utilizarea apelurilor blocante pentru un set de descriptori (fisiere, pipe-uri, socket-uri,…) int select (int nfds1, Valoarea fd_set *readfds, maxima a descript. plus 1 fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); Multimea descriptorilor de citire, scriere si exceptie Timpul de asteptare Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [29]
  • 30. Retele de calculatoare Multiplexarea I/O|select() • Pentru timpul de asteptare se foloseste structura definita in sys/time.h: struct timeval { long tv_sec; /* secunde */ long tv_usec; /* microsecunde */ } • Manipularea elementelor multimii de descriptori (tipul fd_set): void FD_ZERO (fd_set *fdset); void FD_SET (int fd, fd_set *fdset); void FD_CLR (int fd, fd_set *fdset); int FD_ISSET (int fd, fd_set *fdset); Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [30]
  • 31. Retele de calculatoare Multiplexarea I/O|select() • Returneaza: – Numarul descriptorilor pregatiti pentru o operatiune de citire, scriere sau exceptie – Valoarea 0 – timpul s-a scurs, nici un descriptor nu este gata – Valoarea –1 in caz de eroare • Utilizarea lui select() – Declararea unei variabile de tip fd_set – Initializarea multimii cu FD_ZERO() – Adaugarea cu FD_SET() a fiecarui descriptor dorit a fi monitorizat – Apelarea primitivei select() – La intoarcerea cu succes, verificarea cu FD_ISSET() a descriptorilor pregatiti pentru I/O Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [31]
  • 32. Retele de calculatoare Multiplexarea I/O|select() • Un descriptor de socket e gata de citire daca: – Exista octeti receptionati in buffer-ul de intrare (read() returneaza >0) – O conexiune TCP a receptionat FIN (read() returneaza 0) – Socket-ul e socket de ascultare si nr. de conexiuni complete este nenul (se poate utiliza accept()) – A aparut o eroare la socket (read() returneaza –1, cu errno setat) – erorile pot fi tratate via getsockopt() cu optiunea SO_ERROR Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [32]
  • 33. Retele de calculatoare Multiplexarea I/O|select() • Un descriptor de socket e gata de scriere daca: – Exista un numar de octeti disponibili in buffer-ul de scriere (write() returneaza >0) – Conexiunea in sensul scrierii este inchisa (write() va genera SIGPIPE) – A aparut o eroare de scriere (write() returneaza –1, cu errno setat) – erorile pot fi tratate via getsockopt() cu optiunea SO_ERROR • Un descriptor de socket este gata de exceptie daca: – Exista date out-of-band sau socket-ul este marcat ca out-of-band – vezi urmatoarele slide-uri Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [33]
  • 34. Retele de calculatoare Multiplexarea I/O|select() Mai multi clienti pot face cereri la acelasi punct final de comunicare Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [34]
  • 35. Retele de calculatoare Alternative • Servere concurente pre-forked – Se creeaza un numar de procese copil imediat la initializare, fiecare proces liber interactionind cu un anumit client • Servere concurente pre-threaded – Ca mai sus, dar se folosesc thread-uri (fire de executie) in locul proceselor (vezi POSIX threads – pthread.h) – Exemplu: serverul Apache (initial, se creeaza 6 instante httpd) • Probleme: – Numarul de clienti mai mare decit numarul de procese/thread-uri – Numarul de procese/thread-uri prea mare fata de numarul de clienti Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [35]
  • 36. Retele de calculatoare Out of band • TCP (si alte protocoale de transport) ofera un mecanism pentru transmiterea cu prioritate ridicata a anumitor date • Astfel, putem avea doua fluxuri de date: Date normale TCP TCP PORT A PORT B Date speciale Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [36]
  • 37. Retele de calculatoare Out of band • Se utilizeaza bitul URG setat in antetul TCP • Antetul TCP contine un cimp indicind locatia datelor urgente ce trebuie trimise • Trimiterea datelor OOB: – Pentru a expedia un octet urgent intr-un flux de date putem utiliza send(): send ( sd, buff, 1, MSG_OOB ); • Receptionarea datelor OOB: – Se genereaza semnalul SIGURG – Apelul select() va modifica lista descriptorilor de exceptie Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [37]
  • 38. Retele de calculatoare Out of band • Exemplu de trimitere a unui octet OOB Buffer-ul de trimitere TCP 1 N Primul octet Ultimul octet send ( sd, “s”, 1, MSG_OOB ); de trimis de trimis 1 N* Pointer urgent TCP Caracter OOB Transmiterea unui caracter OOB Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [38]
  • 39. Retele de calculatoare Out of band • Citirea datelor OOB: – Se utilizeaza recv(), setind MSG_OOB – Se foloseste monitorizarea out-of-band-mark pentru conexiune: sockatmark() • Utilizari: – Modalitate de comunicare celuilalt punct terminal a unei conditii de exceptie chiar si in cazul cind controlul fluxului a oprit emitatorul – Pentru a detecta timpuriu erori de comunicare intre client si server (heart-beat) Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [39]
  • 40. Retele de calculatoare Out of band • Erori posibile – Se asteapta citirea de date OOB, dar ele nu au fost inca trimise – se returneaza EINVAL – Procesul a fost notificat ca va primi date OOB (via select() sau SIGURG), dar ele inca nu au ajuns – se returneaza EWOULDBLOCK – Se incearca sa se citeasca un acelasi octet OOB de mai multe ori – se returneaza EINVAL Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [40]
  • 41. Retele de calculatoare Out of band • Tratare OOB prin SIGURG ... sd = listen(); cl = accept (sd, NULL, NULL); signal (SIGURG, fct_urg); fnctl (cl, F_SETOWN, getpid()); while (1) { if ((n = read (cl, buf, sizeof (buf) - 1)) == 0) { /* EOF */ } buf[n] = ‘0’; printf (“am citit %d octeti normali: %s”, n, buf); } void fct_urg (int sig) { /* trateaza SIGURG */ n = recv (cl, buf, sizeof (buf) - 1, MSG_OOB); buf[n] = ‘0’; printf (“OOB %d: %s”, n, buf); } Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [41]
  • 42. Retele de calculatoare Critici • API-ul bazat pe socket-uri BSD are o serie de limitari: – Incurajeaza programarea cu erori – Are o complexitate ridicata, deoarece a fost proiectata sa suporte familii de protocoale multiple (dar rar folosite in practica) – Nu este portabila (unele apeluri/tipuri au alte denumiri/reprezentari pe alte platforme; numele fisierelor-antet .h depind de sistem) • Exemplu: la WinSock descriptorii de socket sunt pointeri, in contrast cu implementarile Unix care folosesc intregi Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [42]
  • 43. Retele de calculatoare • Exemplu continind erori 1 #include <sys/types.h> Critici 2 #include <sys/socket.h> 3 const int PORT_NUM = 10000; neinitializarea 4 int echo_server () { 5 struct sockaddr_in addr; tuturor membrilor 6 int addr_len; 7 char buf[BUFSIZ]; 8 int cd; neinitializat 9 int sd = socket (PF_UNIX, SOCK_DGRAM, 0); htons() lipseste 10 if (sd == -1) return -1; 11 addr.sin_family = AF_INET; 12 addr.sin_port = PORT_NUM; 13 addr.sin_addr.addr = INADDR_ANY; 14 if (bind (sd, (struct sockaddr *) &addr, sizeof addr) == -1) return -1; 15 if (cd = accept (sd, (struct sockaddr *) &addr, &addr_len) != -1) { 16 int n; 17 while (n = read (sd, buf, sizeof (buf)) > 0) 18 write (cd, buf, n); 19 close (cd); 20 } PF_UNIX incompatibil cu AF_INET! 21 } listen() omis! Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [43]
  • 44. Retele de calculatoare Critici • Exemplul nu este portabil, deoarece la WinSock socket-urile sunt de tip SOCKET si nu int (mai mult, erorile sunt indicate via macro-ul nestandardizat INVALID_SOCKET_HANDLE) • accept() e apelat pentru un socket de tip invalid, insa compilatorul nu semnaleaza eroarea • Erori in liniile 15 si 17 privitoare la precedenta operatorilor (greseala comuna in C/C++) • In linia 17, read() foloseste socket-ul pasiv ⇒ erori bizare in momentul rularii • Pot aparea posibile erori de scriere: nu se verifica nr. bytes-urilor trimisi in retea via write() – linia 18 Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [44]
  • 45. Retele de calculatoare Rezumat • Modelul client/server UDP • Primitive I/O folositoare • Aspecte mai avansate de programare Internet • Critici aduse API-ului socket Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [45]
  • 46. Retele de calculatoare Intrebari? Sabin-Corneliu Buraga 2006/2007 – www.infoiasi.ro/~busaco/ [46]