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:
- E' possibile attivare il programma in modalità server o client.
- 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.
- 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.
- 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é:
- affidabile: non perdo pezzi per strada
- negoziabile: negozia una scrittura adatta al tasso del client
- 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