Corriere Espresso

Transcript

Corriere Espresso
Corriere Espresso
Descrizione sintetica:
Realizzare un’applicazione client/server che implementi un sistema di gestione della
movimentazione delle merci per un corriere espresso.
Il server modella il gestore del servizio di gestione e consegna delle merci. Ad ogni articolo è
associata una quadrupla (codice articolo, descrizione articolo, indirizzo di destinazione, stato). Il
client modella l’applicazione utilizzata dagli operatori per interfacciarsi con il server centrale.
Ogni operatore può:
- Trasferire merci dal magazzino ai clienti.
- Ritirare articoli dai clienti e trasferirle al magazzino per lo smistamento.
Ogni operatore riceve inizialmente dal server K oggetti che consegna uno per volta ai diversi clienti.
Il server legge da file la lista iniziale degli oggetti da consegnare.
L'applicazione deve essere scritta utilizzando il linguaggio C. Il server concorrente deve essere
scritto utilizzando la programmazione multi-thread. Client e server comunicano attraverso socket
TCP. L'elaborato deve essere corredato da una opportuna documentazione.
Descrizione dettagliata:
Processo server:
Il processo server riceve su linea di comando:
• Un intero N che definisce il numero massimo di operatori attivi;
• Un intero K che definisce il numero di oggetti assegnati inizialmente ad ogni operatore;
• Una stringa S che identifica il nome del file contenente la lista degli oggetti da consegnare
Il file S è un file di testo contenente un unico articolo per riga per il quale sono memorizzate le
seguenti informazioni:
- Codice articolo
- Descrizione articolo
- Indirizzo destinazione
I campi sono separati dal carattere “#”.
All’atto dello start-up, il server carica in memoria tutti gli articoli memorizzati nel file S. Ad ogni
articolo è associato uno stato che può assumere i seguenti valori:
- “in magazzino”: articolo in giacenza pronto per essere consegnato ad un operatore;
- “in consegna”: articolo consegnato ad un operatore per la consegna;
- “consegnato”: articolo consegnato al cliente finale;
- “ritirato”: articolo consegnato dal cliente all’operatore ma non ancora inviato in magazzino
per lo smistamento.
Inizialmente ad ogni articolo è associato allo stato “in magazzino”.
Quando un client operatore richiede la connessione al server, questi crea un thread che gestisce il
client, invia le informazioni relative a K oggetti il cui stato è “in magazzino” e ne modifica lo stato
in “in consegna”. Nota: In magazzino potrebbero esistere meno di K oggetti disponibili.
Il server può ricevere dal client i seguenti comandi:
- elencaserver: Il server invia all’operatore le informazioni relative a tutti gli oggetti in
memoria.
- consegnato#codice: l’operatore ha consegnato l’articolo “codice”. Il server modifica lo stato
dell’articolo da “in consegna” a “consegnato”;
-
ritirato#codice#descrizione#indirizzo: l’operatore ha ritirato un articolo dal cliente. Il server
aggiunge agli articoli memorizzati la quadrupla (codice, descrizione, indirizzo, “ritirato”);
smista#codice: l’operatore deposita l’articolo in magazzino. Lo stato dell’articolo “codice”
passa da “ritirato” a “in magazzino”;
Processo client:
Il processo client riceve sulla linea di comando l’indirizzo IP ed il numero di porta del server.
All’atto della connessione riceve dal server le informazioni relative a K articoli da consegnare e
visualizza le informazioni ricevute su standard output.
Il client legge da standard input i comandi che invia al server e visualizza i messaggi da esso
ricevuti.
I comandi che il client accetta sono:
- elenca: elenca le informazioni degli oggetti che l’operatore deve ancora gestire. Nota:
distinguere gli oggetti “in consegna” dagli oggetti “ritirato”;
- elencaserver: richiede al server l’elenco completo degli articoli;
- consegnato#codice: Se lo stato dell’articolo è “in consegna”, consegna l’articolo al cliente
(visualizzando su standard output il messaggio “Articolo consegnato”) altrimenti visualizza
un messaggio d’errore. Informa il server della consegna ed elimina l’articolo dall’elenco
locale degli articoli da gestire.
- ritirato#codice#descrizione#indirizzo: Aggiunge l’articolo all’elenco locale degli articoli. Si
assuma, per semplicità, che il “codice” sia sempre univoco.
- smista#codice: Se lo stato dell’articolo è “ritirato”, consegna l’articolo al magazzino e lo
elimina dalla lista locale degli articoli.
Il client termina quando la lista locale degli articoli da consegnare è vuota.
Regole generali.
Il server ed il client vanno realizzati in linguaggio C su piattaforma UNIX/Linux. Le comunicazioni
tra client e server si svolgono tramite socket TCP. Oltre alle system call UNIX, i programmi
possono utilizzare solo la libreria standard del C. Saranno valutate negativamente l'uso di primitive
non coperte dal corso (ad es., code di messaggi) al posto di quelle studiate ed il mancato rispetto
delle specifiche.
Relazione
Il progetto va accompagnato da una relazione che contenga almeno le seguenti sezioni:
1. Una guida d'uso per il server e per il client, che illustri le modalità di compilazione e d'uso dei
due programmi.
2. Una sezione che illustri il protocollo al livello di applicazione utilizzato nelle comunicazioni tra
client e server (non il protocollo TCP/IP!).
3. Una sezione che descriva i dettagli implementativi giudicati più interessanti (con particolare
riferimento alle system call oggetto del corso), eventualmente corredati dai corrispondenti
frammenti di codice.
4. In appendice, la relazione deve riportare il codice sorgente integrale del progetto.
Orientativamente, la relazione dovrebbe contenere almeno 10 pagine, esclusa l'appendice. Indicare
sulla copertina della relazione l’elenco dei componenti del gruppo.
Consegna del progetto
Entro due giorni dalla data prescelta per lo scritto finale, vanno consegnati al docente il progetto e la
relazione. Il progetto va inviato all'indirizzo [email protected] in un archivio compresso in
formato zip. La relazione va consegnata al docente anche in formato cartaceo. Il client ed il server
verranno testati, eseguendoli su due o più macchine diverse.