Scrittura dei programmi applicativi di rete
Scrittura dei programmi Scrittura dei programmi
applicativi di rete
applicativi di rete
Contenuti del corso Contenuti del corso
Æ La progettazione delle reti Æ La progettazione delle reti
Æ Il routing nelle reti IP Æ Il routing nelle reti IP
Æ Il collegamento agli Internet Service Provider e problematiche di sicurezza
Æ Il collegamento agli Internet Service Provider e problematiche di sicurezza
Æ Analisi di traffico e dei protocolli applicativi
Æ Analisi di traffico e dei protocolli applicativi
Æ Multimedialità in rete Æ Multimedialità in rete
Æ Tecnologie per le reti future Æ Tecnologie per le reti future
Contenuti del corso Contenuti del corso
Æ La progettazione delle reti Æ La progettazione delle reti
Æ Il routing nelle reti IP Æ Il routing nelle reti IP
Æ Il collegamento agli Internet Service Provider e problematiche di sicurezza
Æ Il collegamento agli Internet Service Provider e problematiche di sicurezza
Æ Analisi di traffico e dei protocolli applicativi
Æ Analisi di traffico e dei protocolli applicativi
Æ Multimedialità in rete Æ Multimedialità in rete
Æ Tecnologie per le reti future Æ Tecnologie per le reti future
Argomenti della lezione Argomenti della lezione
Î L’interfaccia Socket Î
L’interfaccia Socket
Î Client e server TCP e UDP Î
Client e server TCP e UDP
Î Esempi Î
Esempi
Interfaccia Socket Interfaccia Socket
Originariamente sviluppata per i sistemi Unix
Originariamente sviluppata per i sistemi Unix
ÎÎ
Consente al livello delle
applicazioni di richiedere/ottenere servizi del livello di trasporto
(TCP/UDP)
Consente al livello delle
applicazioni di richiedere/ottenere servizi del livello di trasporto
(TCP/UDP) ÎÎ
Tipi di dato Tipi di dato
u_char
u_charu_short
u_shortu_long
u_longunsigned char (8 bit) unsigned char (8 bit)
unsigned short int (16 bit) unsigned short int (16 bit)
unsigned long int (32 bit) unsigned long int (32 bit)
Indirizzo IP Indirizzo IP
/* internet address */
struct in_addr {
u_long s_addr;
};
/* internet address */
struct in_addr {
u_long s_addr;
};
Indirizzo socket Indirizzo socket
/* 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];
};
/* 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];
};
Indirizzo socket Indirizzo socket
/* 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];
};
/* 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];
};
normalmente
non utilizzati!
Struttura socket Struttura socket
sin_len sin_len
sin_family sin_family
sin_port sin_port
sin_zero sin_zero
indirizzo socket remotoindirizzo socket remoto
sin_len sin_len
sin_family sin_family
sin_port sin_port
sin_zero sin_zero
indirizzo socket localeindirizzo socket locale
famiglia famiglia
tipotipo
protocollo protocollo
sin_addr
sin_addr sin_addrsin_addr
Tipi di socket Tipi di socket
livello data-link e livello fisico livello data-link
e livello fisico
TPC TPC
TPC UDP UDP UDP socket
stream socket
stream socket datagram socket
datagram socket socket raw
raw
applicazioneapplicazione
IPIP
Compatibilità dei formati Compatibilità dei formati
Sistema big-endian
Sistema big-endianMSB MSB LSB LSB
00001101 00001101 AA
10111101 10111101 A+1A+1
00000001 00000001 A+2A+2
11100001 11100001 A+3A+3
00001101
00001101 1011110110111101 0000000100000001 1110000111100001
Compatibilità dei formati Compatibilità dei formati
Sistema little-endian
Sistema little-endian00001101
00001101 1011110110111101 0000000100000001 1110000111100001
MSB MSB LSB LSB
00001101 00001101 AA
10111101 10111101 A+1A+1 0000000100000001 A+2A+2
11100001 11100001
A+3A+3
Compatibilità dei formati Compatibilità dei formati
I protocolli della famiglia TCP/IP I protocolli della famiglia TCP/IP
usano il formato
usano il formato
bigbig
--
endianendian
Funzioni di conversione di formato
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);
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 Convertono un intero (signed, long)
dal formato “host”
al formato “network” e viceversa
Funzioni di conversione di indirizzo
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);
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
Convertono la rappresentazione decimale (stringa ASCII) di un
indirizzo IP nella rappresentazione numerica interna e viceversa
Chiamata al DNS 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);
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 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);
struct hostent {
char *hname;
char *haliases[];
int h_addrtype;
int h_length;
char *h_addr_list[];
};
struct hostent *gethostbyname
(const char *hostname);
nome e lista
degli alias
Chiamata al DNS 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);
struct hostent {
char *hname;
char *haliases[];
int h_addrtype;
int h_length;
char *h_addr_list[];
};
struct hostent *gethostbyname
(const char *hostname);
per IPv4:
h_addrtype = AF_INET h_length = 4 (byte)
Chiamata al DNS 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);
struct hostent {
char *hname;
char *haliases[];
int h_addrtype;
int h_length;
char *h_addr_list[];
};
struct hostent *gethostbyname
(const char *hostname);
puntatori agli indirizzi dell’host (può essere
“multihomed”)
Chiamate di sistema Chiamate di sistema
socket bind
connect listen accept socket bind
connect listen accept
sendto
recvfrom read
write close sendto
recvfrom read
write
close
Chiamate di sistema Chiamate di sistema
int socket
(int family, int type, int protocol);
int socket
(int family, int type, int protocol);
AF_INET
AF_INET SOCK_DGRAM SOCK_STREAM SOCK_DGRAM
SOCK_STREAM 00
Î Crea un descrittore socket Î Crea un descrittore socket
Î R
estituisce un intero che sarà usato per i riferimenti al socket
Î Restituisce un intero che sarà
usato per i riferimenti al socket
Chiamate di sistema Chiamate di sistema
int bind
(int sockfd,
const struct sockaddr_in *localaddr, int localaddrlen);
int bind
(int sockfd,
const struct sockaddr_in *localaddr, int localaddrlen);
Î A
ggiunge un indirizzo socket ad socket già creato
Î A
ggiunge un indirizzo socket
ad socket già creato
Chiamate di sistema Chiamate di sistema
int bind
(int sockfd,
const struct sockaddr_in *localaddr, int localaddrlen);
int bind
(int sockfd,
const struct sockaddr_in *localaddr, int localaddrlen);
Î V
iene utilizzata dai server
per dichiarare la porta su cui ascoltano
Î V
iene utilizzata dai server
per dichiarare la porta su
cui ascoltano
Chiamate di sistema Chiamate di sistema
int connect (int sockfd,
const struct sockaddr_in *serveraddr, int serveraddrlen);
int connect (int sockfd,
const struct sockaddr_in *serveraddr, int serveraddrlen);
Î P
ermette ad un processo
(tipicamente il client) di aprire una connessione
Î P
ermette ad un processo
(tipicamente il client) di aprire
una connessione
Chiamate di sistema Chiamate di sistema
int listen
(int sockfd, int backlog);
int listen
(int sockfd, int backlog);
Î U
sata dai server TCP
Î Usata dai server TCP
Î I
nforma il sistema operativo che il server è pronto ad accettare
connessioni (creazione di un
“socket passivo”)
Î I
nforma il sistema operativo che il server è pronto ad accettare
connessioni (creazione di un
“socket passivo”)
Chiamate di sistema Chiamate di sistema
int accept
(int sockfd,
const struct sockaddr_in *clientaddr, int *clientaddrlen);
int accept
(int sockfd,
const struct sockaddr_in *clientaddr, int *clientaddrlen);
Î U
sata dai server TCP
Î Usata dai server TCP
Î R
imuove la prima richiesta di connessione dalla coda delle connessioni in attesa
Î R
imuove la prima richiesta di
connessione dalla coda delle
connessioni in attesa
Chiamate di sistema Chiamate di sistema
int accept
(int sockfd,
const struct sockaddr_in *clientaddr, int *clientaddrlen);
int accept
(int sockfd,
const struct sockaddr_in *clientaddr, int *clientaddrlen);
Î R
estituisce (in serveraddr e in serveraddrlen) l’indirizzo del client
Î R
estituisce (in serveraddr e in
serveraddrlen) l’indirizzo del
client
Chiamate di sistema Chiamate di sistema
int accept
(int sockfd,
const struct sockaddr_in *clientaddr, int *clientaddrlen);
int accept
(int sockfd,
const struct sockaddr_in *clientaddr, int *clientaddrlen);
Î R
estituisce il descrittore
socket da usare per questa connessione
Î R
estituisce il descrittore
socket da usare per questa
connessione
Chiamate di sistema Chiamate di sistema
int sendto
(int sockfd,
const void *buf, int buflen, int flags,
const struct sockaddr_in *toaddr, int toaddrlen);
int sendto
(int sockfd,
const void *buf, int buflen, int flags,
const struct sockaddr_in *toaddr, int toaddrlen);
Î I
nvia un messaggio UDP
Î Invia un messaggio UDP
Chiamate di sistema Chiamate di sistema
int sendto
(int sockfd,
const void *buf, int buflen, int flags,
const struct sockaddr_in *toaddr, int toaddrlen);
int sendto
(int sockfd,
const void *buf, int buflen, int flags,
const struct sockaddr_in *toaddr, int toaddrlen);
Î I
flag normalmente sono a zero
Î Iflag normalmente sono a zero
Chiamate di sistema Chiamate di sistema
int sendto
(int sockfd,
const void *buf, int buflen, int flags,
const struct sockaddr_in *toaddr, int toaddrlen);
int sendto
(int sockfd,
const void *buf, int buflen, int flags,
const struct sockaddr_in *toaddr, int toaddrlen);
Î R
estituisce il numero di byte inviati
Î R
estituisce il numero di byte
inviati
Chiamate di sistema Chiamate di sistema
int recvfrom (int sockfd,
const void *buf, int buflen, int flags,
const struct sockaddr_in *fromaddr, int *fromaddrlen);
int recvfrom (int sockfd,
const void *buf, int buflen, int flags,
const struct sockaddr_in *fromaddr, int *fromaddrlen);
Î R
iceve un messaggio UDP
Î Riceve un messaggio UDP
Chiamate di sistema Chiamate di sistema
int recvfrom (int sockfd,
const void *buf, int buflen, int flags,
const struct sockaddr_in *fromaddr, int *fromaddrlen);
int recvfrom (int sockfd,
const void *buf, int buflen, int flags,
const struct sockaddr_in *fromaddr, int *fromaddrlen);
Î I
flag normalmente sono a zero
Î Iflag normalmente sono a zero
Chiamate di sistema Chiamate di sistema
int recvfrom (int sockfd,
const void *buf, int buflen, int flags,
const struct sockaddr_in *fromaddr, int *fromaddrlen);
int recvfrom (int sockfd,
const void *buf, int buflen, int flags,
const struct sockaddr_in *fromaddr, int *fromaddrlen);
Î R
estituisce il numero di byte ricevuti
Î R
estituisce il numero di byte
ricevuti
Chiamate di sistema Chiamate di sistema
int recvfrom (int sockfd,
const void *buf, int buflen, int flags,
const struct sockaddr_in *fromaddr, int *fromaddrlen);
int recvfrom (int sockfd,
const void *buf, int buflen, int flags,
const struct sockaddr_in *fromaddr, int *fromaddrlen);
Î R
estituisce (in fromaddr e in fromaddrlen) l’indirizzo del mittente
Î R
estituisce (in fromaddr e in
fromaddrlen) l’indirizzo del
mittente
Chiamate di sistema Chiamate di sistema
int read
(int sockfd,
const void *buf, int buflen);
int write
(int sockfd,
const void *buf, int buflen);
int read
(int sockfd,
const void *buf, int buflen);
int write
(int sockfd,
const void *buf, int buflen);
Î L
eggono/scrivono sulla connessione TCP
Î L
eggono/scrivono sulla
connessione TCP
Chiamate di sistema Chiamate di sistema
int read
(int sockfd,
const void *buf, int buflen);
int write
(int sockfd,
const void *buf, int buflen);
int read
(int sockfd,
const void *buf, int buflen);
int write
(int sockfd,
const void *buf, int buflen);
Î R
estituiscono il numero di byte letti/scritti
Î R
estituiscono il numero di byte
letti/scritti
Chiamate di sistema Chiamate di sistema
int close (int sockfd);
int close (int sockfd);
Î C
hiude un socket e interrompe una connessione TCP
Î C
hiude un socket e interrompe
una connessione TCP
Librerie semplificate Librerie semplificate
Æ Sviluppate dal prof. Montessoro per agevolare la scrittura di semplici
esempi didattici di applicazioni client-server
Æ Sviluppate dal prof. Montessoro per agevolare la scrittura di semplici
esempi didattici di applicazioni client-server
Æ Per TCP: tcpsocketlib Æ Per TCP: tcpsocketlib
Æ Per UDP: udpsocketlib Æ Per UDP: udpsocketlib
Libreria tcpsocketlib Libreria tcpsocketlib
int create_tcp_client_connection
(char *ip_address, int port);
int create_tcp_server
(char *ip_address, int port);
int close_tcp_connection (int sk);
int tcp_send (int sk, char *buffer);
int tcp_receive (int sk, char *buffer);
void server_handler (int sk);
int create_tcp_client_connection
(char *ip_address, int port);
int create_tcp_server
(char *ip_address, int port);
int close_tcp_connection (int sk);
int tcp_send (int sk, char *buffer);
int tcp_receive (int sk, char *buffer);
void server_handler (int sk);
Libreria udpsocketlib Libreria udpsocketlib
int create_udp_client (void);
int create_udp_server
(char *ip_address, int port);
int close_udp_socket (int sk);
int udp_send (int sk, char *buffer,
char *ip_address, int port);
int udp_receive (int sk, char *buffer);
int udp_reply (int sk, char *buffer);
void server_handler (int sk);
int create_udp_client (void);
int create_udp_server
(char *ip_address, int port);
int close_udp_socket (int sk);
int udp_send (int sk, char *buffer,
char *ip_address, int port);
int udp_receive (int sk, char *buffer);
int udp_reply (int sk, char *buffer);
void server_handler (int sk);
Esempio: UDP Esempio: UDP
Î I client inoltrano al server l’offerta e l’identificativo dell’offerente
Î I client inoltrano al server l’offerta e l’identificativo dell’offerente
Scrivere un’applicazione
client-server per gestire le offerte in un’asta:
Scrivere un’applicazione
client-server per gestire le offerte in un’asta:
Î Il server mantiene in memoria
soltanto l’offerta migliore e risponde
al client se l’offerta è stata accettata o no
Î Il server mantiene in memoria
soltanto l’offerta migliore e risponde
al client se l’offerta è stata accettata o no
asta.c asta.c
socket
bind (TSAP server)
while (recvfrom
(dati offerta, TSAP client)) { sendto
(TSAP client, risposta)
}
socket
bind (TSAP server)
while (recvfrom
(dati offerta, TSAP client)) { sendto
(TSAP client, risposta)
} socket
sendto
(TSAP server, dati offerta)
receive (risposta) close
socket sendto
(TSAP server, dati offerta)
receive (risposta) close
processo server processo server n processi client
n processi client
Esempio: TCP Esempio: TCP
Scrivere un’applicazione client-server per raccogliere
le iscrizioni per una gara:
ogni client invia il nome del concorrente e riceve dal server
il numero di pettorale
(progressivo) assegnato a quel concorrente
Scrivere un’applicazione client-server per raccogliere
le iscrizioni per una gara:
ogni client invia il nome del concorrente e riceve dal server
il numero di pettorale
(progressivo) assegnato a quel concorrente
Esempio: TCP Esempio: TCP
Il server, inoltre, salva su un file tutti i nomi e i relativi numeri L’elenco degli iscritti può essere
richiesto da qualsiasi client
Il server, inoltre, salva su un file tutti i nomi e i relativi numeri L’elenco degli iscritti può essere
richiesto da qualsiasi client
gara.c gara.c
socket
bind (TSAP server) listen
while (TRUE)
{ accept (connessione) while
(comandi utente) { read
(comando e dati) write (risposta)
close (connessione)} }
socket
bind (TSAP server) listen
while (TRUE)
{ accept (connessione) while
(comandi utente) { read
(comando e dati) write (risposta)
close (connessione)} }
socket connect
(TSAP server)
while (comandi utente) { write
(comando e dati) read (risposta)
}
close socket connect
(TSAP server)
while (comandi utente) { write
(comando e dati) read (risposta)
}
close
processo server processo server n processi client
n processi client
Comandi dal client al server e messaggi di risposta:
Comandi dal client al server e messaggi di risposta:
ISCRIVI <nome>
Æ <nome> <numero di pettorale>
ISCRIVI <nome>
Æ <nome> <numero di pettorale>
gara.c gara.c
LISTA
Æ elenco "<nome> <numero>\n"
terminato da '.' LISTA
Æ elenco "<nome> <numero>\n"
terminato da '.' BYE
Æ "Connessione chiusa\n"
BYE
Æ "Connessione chiusa\n"
Tipi di server Tipi di server
Î Sequenziale senza connessioni (UDP, singolo processo, viene servito un client alla volta)
Î Sequenziale senza connessioni (UDP, singolo processo, viene servito un client alla volta)
Il server non deve essere
monopolizzato da un singolo client:
Il server non deve essere
monopolizzato da un singolo client:
Î Parallelo con connessioni (TCP, un processo per ogni client) Î Parallelo con connessioni
(TCP, un processo per ogni client)
Server sequenziale senza connessioni
Server sequenziale senza connessioni
Un client Un client alla volta alla volta
UDPUDP Porta Portanota
nota Server
Server
UDPUDP Client Client
Porta effimeraPorta effimera
UDPUDP Client Client
Porta effimeraPorta effimera UDPUDP
Client Client
Porta effimeraPorta effimera
TCPTCP
Porte effimerePorte effimere
Server Server
Server parallelo con connessioni
Server parallelo con connessioniTCPTCP Client Client
Porta effimeraPorta effimera TCPTCP
Client Client
Porta effimeraPorta effimera TCPTCP
Client Client
Porta effimeraPorta effimera
Server child Server
child Server
child Server
child Server child Server
child
Porta nota usata solo per Porta nota usata solo per l’apertura della connessione l’apertura della connessione
Client Client Client
socket (…)
socket
socket (…)(…)
recvfrom (…)
recvfrom
recvfrom (…)(…)
close (…)
close
close (…)(…)
sendto (…) sendto
sendto (…)(…)
Ripetuto in base Ripetuto in base
alle necessita alle necessita
Server Server Server
bind (…)
bindbind (…)(…)
Ripetuto infinite Ripetuto infinite
volte volte
Process Process Process recvfrom (…)
recvfrom
recvfrom (…)(…)
socket (…) socket
socket (…)(…)
sendto (…)
sendto
sendto (…)(…)
Risposte Risposte Risposte Richieste Richieste Richieste
Server parent Server
Server parentparent Server
Server
Server socketsocketsocket(…)(…)(…)
bind (…)
bindbind (…)(…)
listen (…)
listen
listen (…)(…)
Ripetuto all’infinito Ripetuto all’infinito Ripetuto all’infinito
accept (…)
accept
accept (…)(…)
fork (…) forkfork (…)(…)
close
(accepting)closeclose
(accepting(accepting))
close
(listening)closeclose
(listening(listening))
Ripetuto in base alle necessita Ripetuto in base Ripetuto in base
alle necessita alle necessita
write (…)
write
write (…)(…)
Processo Processo Processo read (…)
readread (…)(…)
close
(accepting)closeclose
(accepting(accepting))
socket (…)
socket
socket (…)(…)
connect (…) connect connect (…)(…)
Client Client Client
Ripetuto in base alle necessita Ripetuto in base Ripetuto in base
alle necessita alle necessita
read (…)
readread (…)(…)
write (…)
write
write (…)(…)
close (…)
close
close (…)(…) Server child Server Server
child child Risposta Risposta Risposta
Richiesta di connessioneRichiesta di Richiesta di connessione connessione
Richiesta Richiesta Richiesta