Console application realizzata durante il primo anno del corso di Laurea Magistrale presso il Politecnico di Torino.
Si tratta di una applicazione eseguibile da linea di comando, scritta interamente in C, che simula una comunicazione FTP (da cui il nome del progetto, TFTP, ossia Trivial FTP) tra un server remoto e uno o più client.
Il progetto è stato compilato, eseguito e testato su:
– S.O.: GNU/Linux Ubuntu 10.04 – Lucid Lynx
– Compilatore: gcc-4.4.3
Il numero complessivo di linee di codice scritte è di circa 2000.
I client e il server comunicano mediante protocollo UDP per lo scambio di file.
In particolare, per il client, sono state previste le seguenti operazioni:
- CONNECT: il client, noto l’indirizzo del server a cui connettersi e la porta standard su cui lo stesso è in ascolto, lancia il seguente comando:
./client <indirizzo server> <porta server>
All’atto dell’esecuzione, il client crea una socket ed effettua una pseudo-connessione con il server in base ai parametri specificati, invia un carattere standard (per notificare al server la sua presenza) e rimane in attesa di una nuova porta, scelta lato server, necessaria per proseguire con le operazioni di trasferimento. In caso di server occupato o inesistente, scatta un timeout e il client termina la sua esecuzione. Alla ricezione della nuova porta, il client può procedere con l’immissione dei comandi illustrati di seguito;
- UPLOAD: un client può richiedere di inviare al server un file, mediante il comando:
UP <nomefile>
Ricevuta la conferma, il client suddivide quindi il file in blocchi di dimensione opportuna; terminato il trasferimento, il server comunica il successo dell’operazione;
- DOWNLOAD: un client può richiedere di scaricare un file memorizzato sulla macchina server, mediante il comando:
DOWN <nomefile>
Verificata la presenza di tale file, il server procede quindi con l’invio dei dati (logicamente suddivisi in blocchi);
- QUIT: il client può terminare la comunicazione con il server in qualsiasi momento con il comando:
QUIT
Il server è costituito invece da quattro istanze di processi pre-forked, in ascolto sulla porta passata da linea di comando:
./server <porta>
Alla ricezione di un carattere da parte di un client, uno dei processi accoglie la richiesta di [pseudo]connessione inviando un numero di porta valido al client stesso. Ciascun processo server serve le richieste del client a cui è associato fintantoché questi non invia un comando di quit (o nel caso scatti un timeout, introdotto per prevenire eventuali problemi di leakage).
Ulteriori considerazioni:
- vengono gestite le criticità legate ad eventuali crash di server e client, garantendo sempre uno stato coerente e stabile alla ripresa dell’esecuzione del programma;
- l’utente-client ha la facoltà di inserire ulteriori comandi di trasferimento (UP/DOWN/QUIT) anche durante le operazioni in corso; le richieste vengono accodate e gestite in sequenza in base all’ordine di immissione da tastiera;
- viene gestita la concorrenza tra client differenti che accedono a risorse condivise sul server.
Per ulteriori informazioni sul progetto contattatemi tramite email.