[C++] transfer - Trasferimento di file su porte TCP
Beh, siccome i miei spumeggianti futuri progetti sono ancora in fase embrionale, e siccome non posso fare un altro post su Infinite Jest, ho messo su GitHub il progetto che ho presentato all’esame di Reti di Calcolatori. Lo descrivo a grandi linee; per una spiegazione più dettagliata temo proprio che dovrete sciropparvi le mie 15 pagine di tesina :P
Il server viene lanciato così:
$ transfer_server n
Dove n è il numero di porte TCP su cui avverrà il trasferimento (ad esempio 5). Il server si mette in ascolto sulla porta 13690 e aspetta.
Per lanciare il client:
$ transfer_client IP_SERVER NOME_FILE
Il client invia al server una serie di informazioni sul file, che risponde con la lista delle porte su cui effettuare il trasferimento. A questo punto inizia un valzer di thread che mi ha causato qualche emicrania: da ciascun lato partono n thread che si occupano di inviare o ricevere un n-esimo del file. Se i thread partono in modo “disordinato” il trasferimento non riesce e l’emicrania peggiora… Quindi c’è una bella serie di semafori e condizioni da soddisfare.
Dopo la ricezione, il server calcola l’MD5 del file (la classe MD5 non l’ho scritta io; il professore ci aveva sconsigliato di implementare da soli qualsiasi algoritmo di hashing) e lo confronta con quello inviato dal client; se corrispondono, evviva!, il file è arrivato sano e salvo. Il server è strutturato in modo da poter gestire più connessioni contemporaneamente (probabilmente avrà problemi seri già alla quinta/sesta connessione, ma per un esame di triennale da 6 CFU direi che va bene così ^^)
A corredo, una bellissima classe Socket per evitare di impazzire con le syscall originali UNIX e una strepitosa classe SplitFile per la “suddivisione” del file (che in realtà viene semplicemente letta ad offset differenti).
Insomma, l’esame mi ha portato via un po’ di pomeriggi autunnali/invernali ma in fondo mi ci sono anche divertito un bel po’! Spero che tutto ‘sto codice torni utile a qualcuno :)
