{"id":23101158,"url":"https://github.com/carusel02/bittorrent","last_synced_at":"2025-04-03T21:18:08.082Z","repository":{"id":223323434,"uuid":"739540858","full_name":"Carusel02/BitTorrent","owner":"Carusel02","description":"Implement BitTorrent protocol in C","archived":false,"fork":false,"pushed_at":"2024-02-23T20:49:04.000Z","size":434,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-02-09T09:15:04.325Z","etag":null,"topics":["chunks","client","leecher","mpi","protocol","seed","tracker"],"latest_commit_sha":null,"homepage":"","language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Carusel02.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-01-05T20:20:49.000Z","updated_at":"2024-02-23T19:12:26.000Z","dependencies_parsed_at":"2024-02-19T17:29:26.465Z","dependency_job_id":"3154c979-216d-46b2-8313-894cefbb6f75","html_url":"https://github.com/Carusel02/BitTorrent","commit_stats":null,"previous_names":["carusel02/apd-mpi","carusel02/bittorrent"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Carusel02%2FBitTorrent","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Carusel02%2FBitTorrent/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Carusel02%2FBitTorrent/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Carusel02%2FBitTorrent/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Carusel02","download_url":"https://codeload.github.com/Carusel02/BitTorrent/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247078866,"owners_count":20879953,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["chunks","client","leecher","mpi","protocol","seed","tracker"],"created_at":"2024-12-16T23:50:27.673Z","updated_at":"2025-04-03T21:18:08.065Z","avatar_url":"https://github.com/Carusel02.png","language":"C","funding_links":[],"categories":[],"sub_categories":[],"readme":"# README \n## [Tema3 - APD](https://gitlab.cs.pub.ro/apd/tema3)\n##### MARIN MARIUS DANIEL 332CC\n\n### Ideea de baza\nImplementarea logicii unui `tracker`, ce are ca rol gestionarea\nfisierelor intre `clienti`, si a clientilor, de a descarca\nsi uploada fisiere unii de la altii, folosind MPI.\n\n### Implementare\n#### Am folosit urmatoarele structuri:\n- **`chunk_info`**, structura ce contine informatii despre segmente:\n    - *`char hash[HASH_SIZE]`* - hash urile segmentelor\n    - *`int peers[MAX_CHUNKS]`* - clientii care detin un anumit segment\n- **`file_info`**, structura ce contine informatii despre fisiere:\n    - *`char filename[MAX_FILENAME]`* - numele fisierului\n    - *`int id`* - id ul fisierului (extras din nume)\n    - *`int chunks_count`* - numarul de segmente\n    - *`chunk_info chunk[MAX_CHUNKS]`* - informatii despre segmentele fisierelor\n    - *`client owned[MAX_CLIENTS]`* - clientii care detin fisierul\n    - *`client needed[MAX_CLIENTS]`* - clientii care au nevoie de fisier\n- **`client`**, structura ce contine informatii despre clienti:\n    - *`int flag`* - pentru marcarea clientilor care au nevoie/detin un fisier\n    - *`int chunk[MAX_CHUNKS]`* - segmentele detinute de client\n    - *`int count`* - numarul de segmente detinute de client\n\n#### Am folosit urmatoarele enumeratii de tip:\n- **`TAG`**, pentru a marca tipul de mesaj trimis\n    - *`DOWNLOAD`* - pentru a realiza comunicatia dintre client si server (preluarea\n     listei de fisiere)\n    - *`SEND`* - pentru a trimite un mesaj de tip request\n    - *`CHUNK`* - pentru a trimite un mesaj de tip chunk intre 2 clienti\n    - *`DOWN`* - pentru a trimite un mesaj de tip down\n    intre client si server\n- **`STATE`**, pentru a marca o stare a clientului\n    - *`ANSWER`* - pentru a cere unui client un segment\n    - *`COMPLETE`* - pentru a transmite de la client la tracker ca a terminat de\ndescarcat toate fisierele\n    - *`SHUTDOWN`* - pentru a transmite unui client ca serverul se inchide\n\n#### In functia `main`:\n* se initializeaza MPI si se apeleaza functia `tracker` si `peer` conform cerintei\n\n#### In functia `peer`:\n* se citeste din fisierul corespunzator fiecarui client datele despre fisierele pe\ncare le detine si pe care doreste sa le descarce\n* se trimit catre tracker aceste informatii pe rand pentru fiecare client\n* se asteapta raspunsul de la tracker dupa ce a primit\naceste informatii de la toti clientii\n* se creeaza cele 2 thread uri, unul de download si unul de upload\n\n#### In functia `tracker`:\n* se creeaza o baza de date cu informatiile despre fisiere si clienti\n* se transmite catre toti clientii lista de fisiere\n* se asteapta ca toti clientii sa trimita un mesaj\nin care sa anunte ca au terminat de descarcat toate fisierele\n* se trimite un mesaj de tip shutdown catre toti clientii\n\n#### In thread ul de `download`:\n* se receptioneaza lista de fisiere de la tracker\n* se cauta pentru fiecare fisier ce trebuie descarcat clientii care detin segmente din\nacel fisier\n* se trimite un mesaj de tip request catre clientii care detin segmente din acel fisier\n* se receptioneaza mesajele de tip chunk de la clientii care detin segmente din acel\nfisier\n* se scrie in fisierul de output segmentele receptionate\n* la final se trimite un mesaj de tip complete catre tracker\n\n#### In thread ul de `upload`:\n* se receptioneaza mesajele de tip request de la clientii care au nevoie de segmente\n* se receptioneaza mesajele de tip shutdown de la tracker pentru a se inchide thread ul\n* se trimit mesaje de tip chunk catre clientii care au nevoie de segmente\n\n### Mai multe comentarii se regasesc in cod.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcarusel02%2Fbittorrent","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcarusel02%2Fbittorrent","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcarusel02%2Fbittorrent/lists"}