cerca
Temi d'esame di Sistemi - Data non pervenuta
modifica cronologia stampa login logout

Wiki

UniCrema


Materie per semestre

Materie per anno

Materie per laurea


Help

Temi d'esame di Sistemi - Data non pervenuta

Torna alla pagina di Sistemi per l'elaborazione delle informazioni


 :: Temi d'esame di Sistemi - Data non pervenuta ::

Esercizio 1

Scrivete lo pseudocodice includendo chiamate alla socket library necessarie per un programma che ripetta i seguenti requisiti:

  1. E' possibile attivare il programma in modalità server o client.
  2. In modalità server il programma non ha parametri sulla linea di comando e si mette in ascolto su una porta non usata superiore a 1024.
  3. In modalità client il programma riceve il numero di porta di un server sulla linea di comando e invia al server un messaggio (ad esempio "HELLO"), poi termina.
  4. Il server visualizza il messaggio, l'indirizzo e la porta da cui proviene. Resta in attesa di messaggi da altri client.

SOLUZIONE

//Per distinguere se è server o client devo vedere se ci sono parametri sulla 
//  linea di comando.
//argc è la dimensione dela stringa, il numero di parametri passati (è la 
//  dimensione dell'argv)
if(argc == 1)

//server
sockid = socket(PF_INET, SOCK_STREAM, 0);

//faccio il controllo
if(sockid == -1) 
  exit(con vergogna);

//creo la struttura sockaddr_in
sockaddr_in addr {
 addr.sin_family = PF_INET;
 addr.sin_port = 66666;
 addr.sin_addr = localhost;
}

//faccio la bind
int status = bind(sockid, &addr, lenght(addr));

//faccio un controllo sulla bind
 if(status==-1) 
   exit(con stile);

//faccio la listen, 10 è il numero di elementi in coda
listen(sockid, 10);

//inizio il ciclo infinito, andrebbe bene anche un while(1)
for(;;) {
 sockaddr indirizzoclient;
 //indirizzoclient è vuoto, lo riempie la accept, e conterrà 
 //l'indirizzo del client che mi fa la richiesta
 int chi = accept(sockid, &indirizzoclient, lenght(indirizzoclient));
 //creo buffer perché la ''rcv'' legge e scrive su buffer
 char buffer[1000];
 //1000 è la dimensione di buffer
 recv(sockid, &buffer, 1000, 0);
 if(buffer == "HELLO") {
   printf("HELLO \n");
   printf("%s \n,", chi.sin_port);
   printf("%s \n", chi.sin_addr);
  }
close(chi);
}
//fine server e for

else if(argc == 2) {
 //inizio client
 //argc è la dimensione dela stringa, il numero di parametri passati (è la 
 //   dimensione dell'argv)
 //metto argv[1] perché la porta arriva da linea di comando
 int porta = argv[1];
 sockid = socket(PF_INET, sock_stream, 0);
 sockaddr_in addr {
  addr.sin_family = PF_INET;
  addr.sin_port = porta;
  addr.sin_addr = serveraddr;
 }
 int status = connect(sockid, &addr, lenght(addr));
 //faccio il controllo solito sullo status
 //invio HELLO con la send
 //6 è la lunghezza del messaggio
 send(sockid, "HELLO", 6, 0);
 close(chi);
}

Esercizio 2

Considerate un'applicazione di file transfer che:

1. trasmette dati a tasso costante (ad esempio: il mittente genera una PDU di n bit ogni k millisecondi).
2. resta in esecuzione per parecchio tempo.
Dovete scegliere se utilizzare TCP o UDP per questa applicazione. Fornite la vostra scelta e motivate la risposta.

SOLUZIONE

Uso TCP perché:

  1. affidabile: non perdo pezzi per strada
  2. negoziabile: negozia una scrittura adatta al tasso del client
  3. efficienza

Esercizio 3

Spiegate cosa si otterrebbe (e che protocollo si sta usando) se si digita al prompt di comando:

c:/> telnet www.dti.unimi.it 80      (invio)  
GET /

SOLUZIONE

Il protocollo è HTTP e restituisce la pagina principale, senza nient'altro, senza header nè niente e la connessione viene chiusa subito dopo.


Torna alla pagina di Sistemi per l'elaborazione delle informazioni