cerca
La Mail De La Muerte
modifica cronologia stampa login logout

Wiki

UniCrema


Materie per semestre

Materie per anno

Materie per laurea


Help

La Mail De La Muerte

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