BitTorrent
BitTorrent - это небольшой торрентный клиент, написанный с нуля в C ++. Единственная используемая внешняя библиотека - OpenSSL для вычисления хэшей SHA1. Протестировано только на Ubuntu 18.04 Plateform (Dockerfile). В частности, он использовал специфические функции Linux (например, Epoll).
Как это работает
- Во -первых, разобрать в торрент -файле, который «Bencoded». Торрент -файл содержит соответствующую информацию, такую как URL -адрес трекера (UDP или TCP/HTTP), имя файла, размер файла, длина часа и т. Д.
- Запросите список сверстников у трекера. Если все пойдет хорошо, трекер ответит списком пар (IP, порт).
- Начните загружать файл, отправляя сообщения по TCP. Сначала сделайте BitTorrent «рукопожатие», а затем послушайте сообщения «есть» и «Битфилд», чтобы узнать, какие части есть у каждого сверстника. После того, как вы получите сообщение «Unchoke», начните запрашивать блоки.
- Чтобы определить, какую часть будет запрашивать следующее подключением, я использовал очередь приоритетов, которая держит наименьшие запрошенные части сверху. Когда я появляюсь, я проверяю, была ли часть получена.
- Чтобы прочитать из нескольких розетчков TCP одновременно в одном потоке, я использовал объект Epoll (Linux Kernel 2.5.44 и выше).
- Рабочий поток буферизирует полученные данные и время от времени промывает их на диск.
- Текущая скорость загрузки рассчитывается в отдельном рабочем потоке с использованием экспоненциальной формулы распада.
Демо

Строить и бежать
Запустите следующие команды:
mkdir build
cd build
cmake ..
make BitTorrent
./source/BitTorrent <torrent_file>
Тестирование
Запустите следующие команды:
git clone https://github.com/google/googletest.git
mkdir build
cd build
cmake ..
make
После создания проекта, тестовые двоичные файлы расположены в сборке/тесте/