struct mbt_torrent *torrent = mbt_torrent_init();
mbt_be_parse_torrent_file(path, torrent);

struct mbt_net_context *ctx =
    mbt_net_context_init(torrent, ip, port);

mbt_net_contact_tracker(ctx);
mbt_leech(ctx);
Semestre 5 2 semaines

MyBitTorrent

Socle modulaire d’un client BitTorrent : décodage bencode, métadonnées .torrent, pièces de fichiers et couche réseau.

C99 Meson Sockets Epoll OpenSSL / SHA-1

Le projet en quelques mots

MyBitTorrent est un projet académique consacré au protocole BitTorrent. Le programme devait lire un fichier .torrent, contacter son tracker, échanger avec plusieurs pairs et reconstituer les fichiers téléchargés.

Le code conservé suit l’architecture imposée en quatre bibliothèques partagées. Il contient une implémentation substantielle du bencode, de la lecture et de la création des métadonnées, ainsi que de la gestion des pièces et de leur empreinte SHA-1.

La partie réseau est restée à l’état de prototype : les structures, le contact du tracker et une boucle epoll sont présents, mais le protocole pair-à-pair n’est pas achevé.

Architecture du rendu

Meson déclare un exécutable et quatre bibliothèques partagées. Le schéma se lit de haut en bas, depuis la commande utilisateur jusqu’aux utilitaires communs.

Exécutable

mbt

Options de ligne de commande et orchestration du traitement.

Réseau

mbtnet

Contexte, tracker, description des pairs et prototype de téléchargement.

Fichiers

mbtfile

Découpage en pièces et blocs, contrôle SHA-1 et écriture sur disque.

Métadonnées

mbtbe

Arbre bencode, parsing, encodage et manipulation des fichiers .torrent.

Fondations

mbtutils

Chaînes dynamiques et vues mémoire utilisées par les autres modules.

Dépendances réelles : mbtnet s’appuie sur les trois autres bibliothèques ; mbtfile utilise mbtbe, qui utilise à son tour mbtutils et OpenSSL.

Ce qui est présent

Bencode

Décodage et encodage

Le module reconnaît les entiers, chaînes, listes et dictionnaires, puis les représente sous forme d’arbre alloué dynamiquement.

Torrent

Métadonnées

Lecture d’un fichier .torrent, accès à ses champs, affichage lisible et génération de métadonnées pour un fichier ou une arborescence.

Pièces

Blocs et intégrité

Les structures de mbtfile décrivent fichiers, pièces et blocs. Une pièce assemblée peut être contrôlée avec son empreinte SHA-1.

Réseau

Premier socle asynchrone

Le dépôt contient les contextes réseau, le début du dialogue avec un tracker, des structures de pairs et une boucle événementielle basée sur epoll.

Parcours proposés par la CLI

mbt -P fichier.torrent

Inspecter

Parse puis affiche l’arbre bencode d’un fichier de métadonnées.

mbt -m chemin

Créer

Construit les métadonnées et calcule les empreintes des pièces avec SHA-1.

mbt [-i ip] [-p port] fichier

Télécharger

Prépare le contexte réseau ; ce parcours reste incomplet dans le rendu conservé.

L’option -v est reconnue, mais son comportement est encore un placeholder. Les options d’adresse et de port sont analysées par le programme principal.

État du rendu conservé

Socle implémenté

Une base modulaire concrète

Les quatre bibliothèques, leurs en-têtes, leurs sources et leurs cibles Meson sont présents. Le bencode et la gestion des pièces constituent les parties les plus abouties.

À poursuivre

Finaliser les échanges pair-à-pair

Il reste notamment à initialiser et enregistrer les sockets, réaliser le handshake, encoder les messages BitTorrent et valider un téléchargement complet.

L’initialisation Meson fonctionne sur l’environnement actuel. La compilation stricte avec GCC 15 s’arrête toutefois sur plusieurs avertissements traités comme des erreurs ; aucun jeu de tests du projet n’est conservé dans le dépôt.

Apports techniques

Ce projet met en pratique la conception d’API en C, la gestion explicite de la mémoire, la représentation de données récursives, l’intégrité par hachage et la séparation entre métadonnées, stockage et transport réseau.

Le rendu montre aussi la difficulté propre à un protocole distribué : disposer des structures et d’une boucle asynchrone ne suffit pas sans machine d’état, encodage exact des messages et stratégie robuste de connexion aux pairs.