BitTorrent
O BitTorrent é um pequeno cliente de torrente escrito do zero no C ++. A única biblioteca externa usada é o OpenSSL para calcular hashes sha1. Testado apenas no Ubuntu 18.04 Plateform (Dockerfile fornecido). Em particular, usou recursos específicos do Linux (por exemplo, Epoll).
Como funciona
- Primeiro, analise o arquivo torrent que é "fascinado". O arquivo torrent contém informações relevantes como o URL do rastreador (UDP ou TCP/HTTP), o nome do arquivo, tamanho do arquivo, o comprimento da peça etc ...
- Solicite a lista de pares do rastreador. Se tudo correr bem, o rastreador responderá com uma lista de pares (IP, porta).
- Comece a baixar o arquivo enviando mensagens sobre o TCP. Primeiro, faça o "aperto de mão" do BitTorrent e depois ouça as mensagens "Have" e "Bitfield" para saber quais peças cada colega tem. Depois de receber uma mensagem "ENODOKE", comece a solicitar blocos de peças.
- Para determinar qual peça deve ser solicitada a seguir por uma conexão, usei uma fila prioritária que mantém as peças menos solicitadas por cima. Quando estou, verifico se a peça foi recebida.
- Para ler a partir de vários soquetes TCP ao mesmo tempo em um único thread, usei a instalação do Epoll (Linux Kernel 2.5.44 e acima).
- Um encadeamento de trabalhador buffer os dados recebidos e o libera no disco de tempos em tempos.
- A velocidade atual de download é calculada em um tópico de trabalhador separado usando uma fórmula de decaimento exponencial.
Demonstração

Construir e correr
Execute os seguintes comandos:
mkdir build
cd build
cmake ..
make BitTorrent
./source/BitTorrent <torrent_file>
Teste
Execute os seguintes comandos:
git clone https://github.com/google/googletest.git
mkdir build
cd build
cmake ..
make
Depois de ter construído o projeto, os binários de teste estão localizados em construção/teste/