Bittorrent
BitTorrent est un petit client torrent écrit à partir de zéro en C ++. La seule bibliothèque externe utilisée est OpenSSL pour calculer les hachages SHA1. Testé uniquement sur Ubuntu 18.04 Plateform (dockerfile fourni). En particulier, il a utilisé des fonctionnalités spécifiques à Linux (par exemple Epoll).
Comment ça marche
- Tout d'abord, analysez le fichier torrent qui est "bencoded". Le fichier torrent contient des informations pertinentes comme l'URL du tracker (UDP ou TCP / HTTP), le nom du fichier, la taille du fichier, la longueur de la pièce, etc.
- Demandez la liste des pairs du tracker. Si tout se passe bien, le tracker répondra avec une liste de paires (ip, port).
- Commencez à télécharger le fichier en envoyant des messages sur TCP. Faites d'abord la "poignée de main" BitTorrent, puis écoutez les messages "avoir" et "Bitfield" pour savoir de quelles pièces ont chaque pair. Une fois que vous avez reçu un message "Uncolok", commencez à demander des blocs de pièces.
- Pour déterminer quelle pièce doit être demandée ensuite par une connexion, j'ai utilisé une file d'attente prioritaire qui conserve les pièces les moins demandées sur le dessus. Quand je mets, je vérifie si la pièce a été reçue.
- Afin de lire plusieurs sockets TCP en même temps dans un seul thread, j'ai utilisé l'installation Epoll (noyau Linux 2.5.44 et supérieur).
- Un thread de travailleur tamponne les données reçues et la rince du disque de temps à autre.
- La vitesse de téléchargement actuelle est calculée dans un thread de travailleur séparé à l'aide d'une formule de désintégration exponentielle.
Démo

Construire et courir
Exécutez les commandes suivantes:
mkdir build
cd build
cmake ..
make BitTorrent
./source/BitTorrent <torrent_file>
Essai
Exécutez les commandes suivantes:
git clone https://github.com/google/googletest.git
mkdir build
cd build
cmake ..
make
Après avoir construit le projet, les binaires de test sont situés dans la construction / test /