Nota di Copyright RETI DI CALCOLATORI Prof. PIER LUCA MONTESSORO Ing. DAVIDE PIERATTONI Facoltà di Ingegneria Università degli Studi di Udine Questo insieme di trasparenze (detto nel seguito slide) è protetto dalle leggi sul copyright e dalle disposizioni dei trattati internazionali. Il titolo ed i copyright relativi alle slides (ivi inclusi, ma non limitatamente, ogni immagine, fotografia, animazione, video, audio, musica e testo) sono di proprietà degli autori prof. Pier Luca Montessoro e ing. Davide Pierattoni, Università degli Studi di Udine. Le slide possono essere riprodotte ed utilizzate liberamente dagli istituti di ricerca, scolastici ed universitari afferenti al Ministero della Pubblica Istruzione e al Ministero dell Università e Ricerca Scientifica e Tecnologica, per scopi istituzionali, non a fine di lucro. In tal caso non è richiesta alcuna autorizzazione. Ogni altro utilizzo o riproduzione (ivi incluse, ma non limitatamente, le riproduzioni su supporti magnetici, su reti di calcolatori e stampe) in toto o in parte è vietata, se non esplicitamente autorizzata per iscritto, a priori, da parte degli autori. L informazione contenuta in queste slide è ritenuta essere accurata alla data della pubblicazione. Essa è fornita per scopi meramente didattici e non per essere utilizzata in progetti di impianti, prodotti, reti, ecc. In ogni caso essa è soggetta a cambiamenti senza preavviso. L autore non assume alcuna responsabilità per il contenuto di queste slide (ivi incluse, ma non limitatamente, la correttezza, completezza, applicabilità, aggiornamento dell informazione). In ogni caso non può essere dichiarata conformità all informazione contenuta in queste slide. In ogni caso questa nota di copyright e il suo richiamo in calce ad ogni slide non devono mai essere rimossi e devono essere riportati anche in utilizzi parziali. 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 1 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 2 Argomenti della lezione L interfaccia Socket Scrittura dei programmi applicativi di rete e server e Esempi 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 3 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 4 Interfaccia Socket Tipi di dato Originariamente sviluppata per i sistemi Unix Consente al livello delle applicazioni di richiedere/ottenere servizi del livello di trasporto (/) u_char u_short u_long unsigned char (8 bit) unsigned short int (16 bit) unsigned long int (32 bit) 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 5 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 6 1
Indirizzo IP /* internet address */ struct in_addr u_long s_addr; Indirizzo /* aggiunge all indirizzo IP la porta e la famiglia a cui appartiene il protocollo */ struct sockaddr_in u_char sin_len; u_short sin_family; u_short sin_port; struct in_addr sin_addr; u_long s_addr; char sin_zero[8]; 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 7 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 8 Indirizzo /* aggiunge all indirizzo IP la porta normalmente e la famiglia a cui appartiene il protocollo */ non utilizzati! struct sockaddr_in u_char sin_len; u_short sin_family; u_short sin_port; struct in_addr sin_addr; u_long s_addr; char sin_zero[8]; Struttura famiglia tipo protocollo sin_len sin_family sin_port sin_addr sin_zero indirizzo remoto sin_len sin_family sin_port sin_addr sin_zero indirizzo locale 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 9 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 10 Tipi di stream applicazione datagram IP livello data-link e livello fisico raw Compatibilità dei formati Sistema big-endian 00001101 10111101 00000001 11100001 MSB LSB A 00001101 A+1 10111101 A+2 00000001 A+3 11100001 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 11 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 12 2
Compatibilità dei formati Sistema little-endian 00001101 10111101 00000001 11100001 MSB LSB A 11100001 A+1 00000001 A+2 10111101 A+3 00001101 Compatibilità dei formati I protocolli della famiglia /IP usano il formato big-endian 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 13 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 14 Funzioni di conversione di formato u_short htons (u_short host_short); u_short ntohs (u_short network_short); u_long htonl (u_long host_long); u_long ntohl (u_long network_long); Convertono un intero (signed, long) dal formato host al formato network e viceversa Funzioni di conversione di indirizzo unsigned long inet_addr (const char *); int inet_aton (const char *, struct in_addr *); char *inet_ntoa (struct in_addr); Convertono la rappresentazione decimale (stringa ASCII) di un indirizzo IP nella rappresentazione numerica interna e viceversa 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 15 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 16 Chiamata al DNS struct hostent char *hname; char *haliases[]; int h_addrtype; int h_length; char *h_addr_list[]; struct hostent *gethostbyname (const char *hostname); Chiamata al DNS struct hostent char *hname; char *haliases[]; int h_addrtype; int h_length; char *h_addr_list[]; nome e lista degli alias struct hostent *gethostbyname (const char *hostname); 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 17 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 18 3
Chiamata al DNS per IPv4: h_addrtype = AF_INET char h_length *hname; = 4 (byte) struct hostent char int int char *haliases[]; h_addrtype; h_length; *h_addr_list[]; struct hostent *gethostbyname (const char *hostname); Chiamata al DNS struct hostent puntatori agli indirizzi char dell host *hname; (può essere char multihomed ) *haliases[]; int h_addrtype; int h_length; char *h_addr_list[]; struct hostent *gethostbyname (const char *hostname); 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 19 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 20 bind connect listen accept sendto recvfrom read write int (int family, int type, int protocol); AF_INET AF_INET AF_INET SOCK_DGRAM SOCK_STREAM SOCK_RAW 0 0 prot. Crea un descrittore Restituisce un intero che sarà usato per i riferimenti al 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 21 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 22 int bind const struct sockaddr_in *localaddr, int localaddrlen); int bind const struct sockaddr_in *localaddr, int localaddrlen); Aggiunge un indirizzo ad già creato Viene utilizzata dai server per dichiarare la porta su cui ascoltano 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 23 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 24 4
int connect const struct sockaddr_in *serveraddr, int serveraddrlen); Permette ad un processo (tipicamente il client) di aprire una connessione int listen int backlog); Usata dai server Informa il sistema operativo che il server è pronto ad accettare connessioni (creazione di un passivo ) 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 25 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 26 int accept const struct sockaddr_in *clientaddr, int *clientaddrlen); Usata dai server Rimuove la prima richiesta di connessione dalla coda delle connessioni in attesa int accept const struct sockaddr_in *clientaddr, int *clientaddrlen); Restituisce (in clientaddr e in clientaddrlen) l indirizzo del client 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 27 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 28 int accept const struct sockaddr_in *clientaddr, int *clientaddrlen); Restituisce il descrittore da usare per questa connessione int sendto const struct sockaddr_in *toaddr, int toaddrlen); Invia un messaggio 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 29 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 30 5
int sendto const struct sockaddr_in *toaddr, int toaddrlen); I flag normalmente sono a zero int sendto const struct sockaddr_in *toaddr, int toaddrlen); Restituisce il numero di byte inviati 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 31 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 32 int recvfrom const struct sockaddr_in *fromaddr, int *fromaddrlen); Riceve un messaggio int recvfrom const struct sockaddr_in *fromaddr, int *fromaddrlen); I flag normalmente sono a zero 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 33 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 34 int recvfrom const struct sockaddr_in *fromaddr, int *fromaddrlen); Restituisce il numero di byte ricevuti int recvfrom const struct sockaddr_in *fromaddr, int *fromaddrlen); Restituisce (in fromaddr e in fromaddrlen) l indirizzo del mittente 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 35 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 36 6
int read const void *buf, int buflen); int write const void *buf, int buflen); Leggono/scrivono sulla connessione int read const void *buf, int buflen); int write const void *buf, int buflen); Restituiscono il numero di byte letti/scritti 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 37 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 38 int (int sockfd); Chiude un e interrompe una connessione Tipi di server Il server non deve essere monopolizzato da un singolo client: Sequenziale senza connessioni (, singolo processo, viene servito un client alla volta) Parallelo con connessioni (, un processo per ogni client) 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 39 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 40 sequenziale senza connessioni Un client alla volta nota sequenziale n processi client processo server sendto (TSAP server, comando e dati) receive (risposta) bind (TSAP server) while (recvfrom (comando e dati, TSAP client)) sendto (TSAP client, risposta) } 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 41 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 42 7
sequenziale (bloccante!) processo server n processi client connect (TSAP server) while (comandi utente) write (comando e dati) read (risposta) } bind (TSAP server) listen while (TRUE) accept (connessione) while (comandi utente) read (comando e dati) write (risposta) } (connessione) } 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 43 parallelo con connessioni child child child Porte effimere nota usata solo per l apertura della connessione 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 44 ( ) Ripetuto in base alle necessità sendto ( ) recvfrom ( ) ( ) Richieste Risposte ( ) bind ( ) Ripetuto infinite volte recvfrom ( ) Process sendto ( ) 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 45 ( ) connect ( ) Ripetuto in base alle necessità write ( ) read ( ) ( ) Richiesta (listening) Richiesta di connessione Ripetuto in base alle necessita read ( ) Processo Risposta write ( ) (accepting) child ( ) bind ( ) listen ( ) Ripetuto all infinito accept ( ) fork ( ) (accepting) parent 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 46 Librerie semplificate Libreria tcplib Sviluppate dal prof. Montessoro per agevolare la scrittura di semplici esempi didattici di applicazioni client-server Per : tcplib Per : udplib Per datagram IP senza intestazione di livello di trasporto: rawlib 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 47 int create_tcp_client_connection (char *ip_address, int port); int create_tcp_server (char *ip_address, int port); int _tcp_connection (int sk); int server_handler (int sk); 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 48 8
Libreria tcplib Libreria udplib int tcp_send (int sk, char *buffer); int tcp_receive (int sk, char *buffer); void tcp_putchar (int sk, int ch); int tcp_getchar (int sk); int create_udp_client (void); int create_udp_server (char *ip_address, int port); int _udp_ (int sk); 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 49 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 50 Libreria udplib int udp_send (int sk, char *buffer, char *ip_address, int port); int udp_receive (int sk, char *buffer); int udp_receive_and_get_sender_info (int sk, char *buffer, char *ip_address, int *pport); int udp_reply (int sk, char *buffer); 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 51 Libreria rawlib int create_raw_ (char *ip_address, int protocol); int _raw_ (int sk); int raw_send (int sk, char *buffer, char *ip_address); int raw_receive_and_get_sender_info (int sk, char *buffer, char *ip_address); int raw_reply (int sk, char *buffer); 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 52 Acknowledgements/ bibliografia Behroutz A. Forouzan I protocolli /IP McGraw-Hill 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 53 9