Table of Contents

Piattaforme Software per la Rete: Novità

Quest'area è dedicata agli aggiornamenti relativi al corso di Piattaforme Software per la Rete.

Visione compiti

Salve, chi volesse vedere il compito puo' passare in ufficio (primo piano DEI) martedi' prossimo alle 17:30.

· 2012/07/20 17:08 · Giovanni Agosta

Voti dell'ultimo appello

Abbiamo completato la correzione di entrambe le parti. Ecco i voti del modulo 2.

Matricola Voto
744107 4
741454 5
727595 5
715966 7
741591 7
742610 7
726672 1.5
742122 8.5
728233 5
733052 11.5
741970 5
743946 6
741275 7.5
745062 10
728214 7.5
728893 6.5
729808 0
744525 8
730433 11
741099 10
729341 8.5
729691 4.5
741280 6.5
744195 7.5
703702 6
730814 3
· 2012/07/20 11:17 · Giovanni Agosta

Soluzioni compito del 16/07/2012

Esercizio 1

Al solito, l'esercizio di comprensione del codice e' autocontenuto. Eseguite lo script seguente col vostro numero di matricola come argomento per avere la soluzione:

#!/bin/bash

a=0
foo() {
        for i in $* ;
                do echo ${i##7} ;
                a=${#i}+$a ;
        done ;
}

bar() {
        typeset -a b;
        i=$1
        j=0
        while ((${#i}>1)) ; do 
                b[$j]=$(($i%100));
                i=$(($i/100));
                j=1+$j;
                echo $(($j)) $i
        done ;
        echo ${#b[@]}
        foo ${b[*]} ;
}

bar $1
echo $a
Esercizio 2

Il testo chiede di definire un protocollo applicativo per registrazione e invio di messaggi, e di implementare il server che gestisce il sistema di comunicazione.

Il protocollo contiene, naturalmente, due tipi di messaggi: il messaggio di registrazione e quello di invio di testo. Possiamo definire il messaggio di registrazione come “JOIN <#canale>\n”, mentre il messaggio di testo puo' essere preso come default (tutto cio' che non corrisponde ad un altro comando e' inteso come testo da inviare ai client).

Il server deve mantenere una lista di client (identificati dai loro descrittori di file), e associare a ciascun client il canale richiesto o nessun canale prima dell'arrivo del messaggio di registrazione; assumiamo un valore “non associato”, ad esempio:

#define NOCHAN -1

Ai fini della soluzione, la lista puo' essere sostituita da un array, per evitare la complessita' (peraltro non enorme) della creazione dinamica della struttura dati.

Notate che, siccome il client puo' scegliere di cambiare il canale in uso, e' piu' semplice realizzare un server multi-thread o sequenziale che non un server multiprocesso.

Nel caso del server sequenziale (consigliato per semplicita'), si impiega la funzione select per attendere una scrittura su uno o piu' dei file descriptor associati ai client, come visto nell'esempio presentato a lezione.

La differenza rispetto a quel caso sta nel fatto che, in risposta alla lettura di un messaggio “JOIN <#canale>\n” il server deve aggiornare la lista dei client con l'informazione opportuna, mentre per qualunque altra stringa s letta dal descrittore fd, deve svolgere le seguenti operazioni:

for(sender=list_head; 
    sender->fd!=fd && sender!=NULL; 
    curr=sender->next);
if (sender==NULL) error();
for(curr=list_head;
    curr!=NULL;
    curr=curr->next)
  if (curr->chan==sender->chan) 
     write(curr->fd,s, strlen(s));

Notate che sono possibili molte altre soluzioni, questa e' solo quella che mi sembra piu' semplice.

Esercizio 3
  1. seteuid cambia l'uid effettivo (quello che viene impiegato per determinare i permessi); poiche' viene posto a 300 prima di leggere un file che non appartiene all'utente 300 e ha solo permessi di lettura per il proprietario, la lettura fallisce.
  2. Sono differenti (vedete le slide); la prima accetta anche pacchetti con indirizzo sorgente modificato opportunamente.
  3. Dato che i dati sono piccoli, si puo' lasciare una cella vuota per l'identificazione del buffer pieno. Nel secondo caso e' meglio non farlo. Si puo' quindi usare un contatore, o uno degli altri metodi visti nelle esercitazioni.

Soluzioni compito del 26/06/2012

Esercizio 1

foo: calcola la cifra massima della stringa $1, la pone in $a, pone in $b il resto della stringa stessa.

bar: usa foo per ordinare le cifre di $1.

Il risultato puo' essere calcolato eseguendo lo script:

#!/bin/bash

function foo (){
local i=0
local j=-1
while (( $i<${#1} )) ; do \
	if test ${1:$i:1} -gt $j ; \
		then j=${1:$i:1} ; \
	fi ; \
	i=$i+1 ; \
done
i=0
while (( $i<${#1} )) ; do \
	if test ${1:$i:1} -eq $j ; \
		then b=${1:0:$i}${1:$i+1} ; \
		break ; \
	fi ; \
	i=$i+1 ; \
done
a=$j
}

a=0
d=""
b=0

function bar(){
local i=0
local c=$1
while (( ${#c} )) ; do \
	foo $c ; \
	c=$b ; \
	d=$d$a ; \
done
}

bar $1
echo $d
Esercizio 2

Input di rpcgen:

struct input_data {
  string text<1024>;
  string delim<16>;
} 

struct output_data {
  int nwords;
  float avg_len;
}

typedef struct input_data input_data;
typedef struct output_data output_data;
typedef string help_data[SIZE_OF_HELP];

program WCPROG {
  version WCVERSION1 {
    output_data wcount(input_data) = 1;
    helpdata help(void) = 2;
  } = 1;
} = 44444;

L'implementazione consiste nell'impiegare strtok per estrarre le parole una alla volta, e calcolarne la lunghezza:

char *curr=strtok(text,delim);
int wc=0;
int tot_len=0;
while(curr) {
  wc++;
  tot_len+=strlen(curr);
  curr=strtok(NULL,delim);
}

Il valore di ritorno va inserito in una struttura analoga a quella dichiarata in XDR.

Esercizio 3
  1. wlan0 e' DOWN; ip link set wlan0 up (oppure ifconfig wlan0 up).
  2. e' disponibile una shell bash con la possibilita' di setuid; chmod a-s, da root.
  3. uccide il processo (l'handler impostato non ha effetto).

Progetti e Temi d'esame

Sono ancora disponibili i progetti su kbreakout, DTLS con supporto HW, e scheduling dinamico di istruzioni ARM.

Ho messo a disposizione i temi d'esame dello scorso anno.

G.

· 2012/04/14 10:19 · Giovanni Agosta

Older entries >>