Programul consta in implementarea unui tracker si a unor clienti cu 3 posibile roluri: seed
, peer
, leecher
.
- Detine un vector de informatii pentru fisiere, cu rol de baza de date.
- Structura fiecarui fisier (
file_info
), contine numele fisierului si un vector de segmente. - Structura unui segment contine hash-ul, indexul segmentului in fisier si clientii care il detin.
- Initial, tracker-ul primeste informatii de la clienti (
add_files_to_tracker_database
). - Cat timp programul ruleaza, tracker-ul poate primi cereri de tipul
OWNERS REQ
, urmate de numele unui fisier, la care raspunde prin a trimite clientului informatii: numarul de segmente, clientii care detin fiecare segment, si indexul segmentului in fisier. - In cazul in care primeste un mesaj de tip
READY
, inseamna ca un client si-a terminat de completat fisierele si il marcheaza in vector. - Daca toti clientii au terminat de downloadat, trimite un mesaj sa ii notifice pentru a le opri executia (
send_done_message
).
- Tracker-ul primeste informatii despre fisiere de la clienti si le completeaza in baza de date, trimitand apoi un mesaj de confirmare catre clienti (
FILES OK
).
- Trimite mesajul
DONE
catre toate thread-urile de upload, pentru a le anunta ca isi pot termina executia.
- Detine cate un vector de informatii pentru fisierele detinute si pentru cele dorite.
- Structura
file_requested
contine numele fisierului, segmentele primite si numarul lor. - Fisierele detinute sunt de tipul
file_info
, descris mai sus. Similar pentru segmente. - Citeste din fisierul lui informatiile despre ce segmente detine si pe care le doreste si le trimite catre tracker.
- Dupa primirea mesajului de confirmare, se creeaza doua thread-uri:
download_thread
siupload_thread
.
- Ruleaza pana la primirea mesajului
DONE
de la tracker. - Poate primi cereri de tipul
CHUNK REQ
, alaturi de numele fisierului si indexul segmentului, in urma carora trimite segmentul cerut clientului.
- Cat timp mai sunt fisiere incomplete, se cer pentru fiecare segmentele lipsa.
- Daca toate fisierele au fost create, se trimite catre tracker mesajul
READY
.
- Functie care se ocupa de cererea informatiilor despre un fisier de la tracker (
request_file_info_from_tracker
), cererea hash-ului pentru fiecare segment (request_chunk_from_peer
) si crearea fisierului de output daca s-au obtinut toate informatiile(create_client_file
).
- Trimite tracker-ului o cerere
OWNERS REQ
, urmata de numele fisierului. - Primeste inapoi informatii despre fiecare segment: clientii care il detin si indexul.
- Alege clientul de la care sa se ceara segmentul.
- Trimite mesajul
CHUNK REQ
, urmat de numele fisierului si de index. - Primeste hash-ul si completeaza datele in structura.
- Daca inca nu exista, creeaza fisierul, altfel doar adauga hash-ul curent.