Torna alla pagina di Sistemi Anticoncezionali delle Reti e dei Damiani
:: La Mail De La Muerte ::
Scopo
Per ottenere delucidazioni su alcuni esercizi dei temi d'esame, dobbiamo intasare il mail server del buon Damiani e di tutti i suoi pseudo-assistenti con le nostre domande. A qualcuno dovranno pur rispondere?! (in modo sensato, possibilmente)
Indirizzi: damiani@dti.unimi.it - ceravolo@dti.unimi.it - FRATI E COLOMBO???
Di seguito alcuni esercizi su cui abbiamo deciso che esigiamo spiegazioni. Chi volesse aggiungerne altri, FA BENE.
Esercizi da copiare nella mail
Esercizio 1 del 11-11-2005
Scrivete lo pseudocodice e le chiamate alla socket library necessarie per realizzare un semplice WWW client con i seguenti requisiti:
1. Dalla linea di comando, leggete (1) la URL che si vuol leggere sul server e (2) il server port number. Create il socket e collegatelo alla porta specificata (e.g., HTTP porta 80) [suggerimento: usate le chiamate getservbyname, gethostbyname, socket, connect].
2. Inviate la richiesta al WWW server usando il messaggio GET del protocollo http. Specificate esplicitamente la richiesta.
3. Leggete i dati dalla connessione HTTP e salvateli su un file temporaneo creato nella vostra WWW cache (e.g., /tmp/yourloginname)sul computer locale
4. Lanciate il processo di un viewer per mostrare a video il ile (suggerimento: usate [fork/exec]. Spiegate almeno due tecniche che potreste usare per decidere il viewer da lanciare a seconda del contenuto del file (suggerimento:usate il campo ContentType di http)
SOLUZIONE
//suppongo che il nome del mio host sia il primo argomento passato da linea di comando //e che il numero di porta sia il secondo nome = argv[1]; porta = argv[2]; //creo il socket "sockid" int sockid = socket (PF_INET, SOCK_STREAM, 0); //costruisco la struct sockaddr_in , che chiamo "destinazione" destinazione.sin_famyly = AF_INET; destinazione.sin_port = porta; // numero di porta passato come argomento destinazione.sin_addr = gethostbyname(nome); // nome dell’host //DOMANDA: E' GIUSTO FARE COSI'??? //faccio la connect if(status = connect (sockid, destinazione, NULL) < 0) { print(“Errore”); exit(-1); } //definisco una string "richiesta" per inviare al server il metodo GET string richiesta = ”GET” + nome + “HTTP/1.1 \n” + “connection: close”; // molto pseudo //invio la richiesta send(sockid, richiesta, strlen(richiesta), 0); //definisco una string "risposta" per ricevere l'HTTP response dal server string risposta; //invoco una receive ed immagazzino tutto nella variabile "risposta" recv (sockid, risposta, strlen(risposta), 0); //chiudo il socket controllando che vada a buon fine close(sockid); //controllo che la prima riga della variabile "risposta" sia "HTTP/1.1 200 OK" //primaRiga() è una funzione che estrae la prima riga della stringa passata come parametro if(primaRiga(risposta) != “http/1.1 200 OK”) { print(“errore”); exit(-1); } //salvo la stringa "risposta" in un file temporaneo nella cartella /tmp/yourloginname //DOMANDA: DEVO SPIEGARE COME SI IMPLEMENTA LA CREAZIONE DEL FILE? SE SI', COME?? //utilizzando un algoritmo di string-matching cerco nel file la //sequenza di caratteri "Content-type " //da qui in poi copio i caratteri in una variabile stringa "cont" fino ai caratteri "\n" string cont = copiaCaratteri(fileTemporaneo); //utilizzo uno switch per scrivere in una stringa "comando" il nome del viewer da aprire //a seconda del valore contenuto in "cont" switch (cont) { case "text/html": comando = "Mozilla 5.0"; break; case ”image/*”: comando = "Gimp"; break; case ”audio/*”: comando = "Windows media player"; break; default: comando = "Notepad"; break; } //aggiungo a "comando" il percorso e il nome del file comando = comando + “/temp/temporaneo.temp”; //eseguo exec(comando); return(0);
Esercizio 1 del 12-05-2007
Siete stati incaricati di scrivere usando i socket un server a cui possono collegarsi dei citofoni. I citofoni sono collegati al server tramite Ethernet 10Mbps. Il programma server riceve sulla porta 8888 richieste di connessione dai citofoni. Ogni citofono apre due connessioni: una di controllo e l’altra su cui passano I pacchetti dati contenenti la voce campionata. Il server conclude la connessione che trasporta la conversazione quando riceve sulla connessione di controllo un pacchetto contenente la stgringa STOP . Fornite lo schema e lo pseudocodice delle principali chiamate socket necessarie per il corretto funzionamento del programma. Gestite correttamente il problema della possible simultaneità delle richieste di connessione.
SOLUZIONE
SCHEMA A BLOCCHI

PSEUDOCODICE: ...
Esercizio 1 del 20-04-2006
Una rete comprende i router A,B,C,D,E,F,G. Il router C ha appena ricevuto i seguenti messaggi:
(da A: (B, 2), (E, 6))
(da B: (A, 3), (C, 5), (F, 5))
(da D: (C, 3), (F, 6))
(da E: (A, 5), (C, 4), (F, 7))
(da F: (B, 2), (D, 7), (E, 3), (G, 1))
Al router C risultano il costo verso B a 3, verso D a 6 e verso E a 1. Calcolate la tabella di instradamento da C verso gli altri router.
DUBBI
- le distanze tra router adiacenti valgono tutte 1, o possono avere pesi diversi?
- nelle informazioni passate nelle varie righe "da A: (B, 2) ...", i router indicati tra parentesi presumo siano le destinazioni. Devo quindi desumere che non mi vengono passate informazioni sui next hop?
- se per arrivare in un router destinazione devo passare per un next hop, è giusto sommare le distanze? (in classe veniva aggiunto sempre +1 alla distanza col next hop, ma in questo caso otterrei valori incoerenti)
- del router G non so nulla?
Torna alla pagina di Sistemi Anticoncezionali delle Reti e dei Damiani