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”.
© Copyright 2024 ExpyDoc