Visione compiti
Salve, chi volesse vedere il compito puo' passare in ufficio (primo piano DEI) martedi' prossimo alle 17:30.
Quest'area è dedicata agli aggiornamenti relativi al corso di Piattaforme Software per la Rete.
Salve, chi volesse vedere il compito puo' passare in ufficio (primo piano DEI) martedi' prossimo alle 17:30.
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 |
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
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.
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
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.
ip link set wlan0 up
(oppure ifconfig wlan0 up
).chmod a-s
, da root.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.