(:title 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)
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);
Torna alla pagina di Sistemi Anticoncezionali delle Reti e dei Damiani