Esercizi 6

RC – Reti di Calcolatori
Anno Acc. 2013-14
Esercizi 23/05/2014
1. Implementare un sistema client-server che si scambia messaggi usando un pocket UDP ed un socket
TCP come segue.
Server
• Il server riceve su linea di comando due numeri di porta port1 e port2 e crea un socket UDP con
numero di porta port1 ed un socket TCP con numero di porta port2
• il server attende inizialmente un messaggio “hello” dal client sul socket UDP
• il server invia sul socket UDP un messaggio al client contenente l’indirizzo IP ed il numero di
porta del socket TCP creato
• per ogni messaggio ricevuto sul socket TCP il server invia al client un echo
• se riceve un messaggio “fine-connessione” sul socket UDP, invia un messaggio “OK-fine” sul socket
UDP. Quindi rimane in attesa di messaggi sul socket TCP per altri 10 secondi. Se esistono, anche
per tali messaggi un echo viene prodotto. Quindi il server chiude la connessione TCP e si rimette
in attesa di un “Hello” sul socket UDP
Per per ogni echo prodotto ed inviato sulla connessione TCP, il server controlla che la connessione
sia ancora attiva (nessun messaggio di errore dopo ogni invio). In caso di errore, il server chiude
la connessione immediatamente, e ritorna in attesa di un messaggio “Hello” sul socket UDP.
Client
• Il client invia al server sul pocket UDP ricevuto su linea di comando un messaggio “Hello”. Quindi
riceve un messaggio di risposta contenente le specifiche di un socket (indirizzo IP e numero di
porta) .
• Il client stabilisce una connessione TCP con il server sul socket specificato ed invia al server linee
prese da terminale, attendendo per ognuna di esse un echo dal server.
• se il client riceve da terminale EOF da terminale allora invia il messaggio “fine-connessione” al
server sul socket UDP e chiude il proprio lato della connessione TCP (shutdown(fd, SHUT WR))
• dopo l’invio di “fine-connessione”, il client attende un messaggio “OK-fine” dal client sul socket
UDP e quindi termina.
Esercizi 23/05/2014
2
2. Si progetti ed implementi un’applicazione client-server che realizzi una semplice chat con le seguenti
caratteristiche:
• Il server riceve le richieste di connessione da parte dei client e funziona come punto di raccolta e
smistamento (a seguito di elaborazione) di messaggi.
• Ogni client, al momento della connessione, fornisce al server un nickname con cui lutente comparir`
a
in chat. Successivamente, il server, in risposta ad un messaggio ricevuto da un dato client, invier`
a
a tutti gli altri client un nuovo messaggio, anteponendo ad esso il nickname del client che ha
inviato. Il server stampa a video un messaggio contenente il nickname di ogni client al momento
della connessione. Per esempio, il client Pippo si `e connesso.
• Il messaggio che il server invia agli altri client, in risposta ad un messaggio ricevuto, `e frutto
di una computazione. Precisamente, alla ricezione di ogni messaggio da parte di un client, il
server genera un numero pseudo-casuale: se il numero `e pari, calcola ed invia il reverse del
messaggio ricevuto. Per esempio, se il client Pippo invia il messaggio “ciao” al server e il numero
pseudo-casuale generato dal server `e 10602, il server invier`a a tutti gli altri client in chat il
messaggio “Pippo:10602:oaic”. Se, invece, il numero `e dispari, allora invia il messaggio inalterato.
Per esempio, se il client Pippo invia il messaggio “bravo” al server e il numero pseudo-casuale
che il server ha generato `e 12403, il server invier`a a tutti gli altri client in chat il messaggio
“Pippo:12403:bravo”.
• Quando il client si disconnette, il server stampa a video un messaggio di disconnessione. Per
esempio, “il client Pippo ha lasciato la chat”.
• Infine, quando il server viene arrestato, prima di terminare definitivamente la propria esecuzione,
stampa a video un messaggio di terminazione. Per esempio, “la chat stata terminata.”
Suggerimenti: loperatore % restituisce il resto della divisione, e.g., 100%2 = 0, 51%2 = 1. La funzione random() (#include<stdlib.h>) genera una seguenza di numeri interi pseudo-casuali, e.g.,
c=random( ); assegna alla variabile int c un numero pseudo-casuale. Infine, si ricordi che le rappresentazioni in memoria delle stringhe ottenute da tastiera tramite fgets() terminano con “\n \0”.