Bittorrent
BitTorrent ist ein kleiner Torrent -Client, der in C ++ von Grund auf neu geschrieben wurde. Die einzige externe Bibliothek ist OpenSSL zum Berechnen von SHA1 -Hashes. Nur auf Ubuntu 18.04 Plateform (Dockerfile bereitgestellt) getestet. Insbesondere verwendete es Linux -spezifische Merkmale (z. B. Epoll).
Wie funktioniert es
- Analysieren Sie zunächst die Torrent -Datei, die "Bencoded" ist. Die Torrent -Datei enthält relevante Informationen wie die Tracker -URL (UDP oder TCP/HTTP), den Dateinamen, die Dateigröße, die Stücklänge usw.
- Fordern Sie die Peer -Liste aus dem Tracker an. Wenn alles gut geht, antwortet der Tracker mit einer Liste von (IP, Port) Paaren.
- Laden Sie die Datei herunter, indem Sie Nachrichten über TCP senden. Machen Sie zuerst die BitTorrent "Handshake" und hören Sie sich die Nachrichten "Have" und "Bitfield" an, um zu wissen, welche Teile jeder Peer hat. Sobald Sie eine "Unchoke" -Meldung erhalten haben, fordern Sie Stück Blöcke an.
- Um zu bestimmen, welches Stück als nächstes von einer Verbindung angefordert werden soll, habe ich eine vorrangige Warteschlange verwendet, die die am wenigsten angeforderten Teile oben hält. Wenn ich knalle, überprüfe ich, ob das Stück empfangen wurde.
- Um gleichzeitig in einem einzigen Thread von mehreren TCP -Sockets zu lesen, habe ich die EPOLD -Funktion (Linux -Kernel 2.5.44 und höher) verwendet.
- Ein Worker -Thread puffert die empfangenen Daten und spült sie von Zeit zu Zeit auf die Festplatte.
- Die aktuelle Download -Geschwindigkeit wird in einem separaten Worker -Thread unter Verwendung einer exponentiellen Zerfallsformel berechnet.
Demo

Bauen & rennen
Führen Sie die folgenden Befehle aus:
mkdir build
cd build
cmake ..
make BitTorrent
./source/BitTorrent <torrent_file>
Testen
Führen Sie die folgenden Befehle aus:
git clone https://github.com/google/googletest.git
mkdir build
cd build
cmake ..
make
Nach dem Bau des Projekts befinden sich die Testbinärdateien in Build/Test/