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