Pergunta

Eu tenho que implementar um sistema de middleware para compartilhamento de arquivos, e tem que dividir os arquivos não ao contrário do que acontece no bittorrent, onde ele envia e recebe peças separadas simultaneamente a partir de fontes de varios. Como faço isso? É uma biblioteca ou eu tenho que implementar o arquivo de divisão mim?

Foi útil?

Solução

Dividir os arquivos em blocos, digamos que de 100KB cada um. Em seguida, calcular um hash SHA (ou algum outro algoritmo de hashing) em cada um dos blocos. por isso, se o arquivo é 905KB, você teria que 10 desses hashes calculados.

O servidor deve conter um arquivo de definição de hash para cada arquivo que ele serve. Este arquivo de definição de hash deve conter uma lista de todos os blocos do arquivo, juntamente com o hash. Então, se o servidor está servindo nosso arquivo 905KB chamado test.exe. Então teríamos um outro arquivo chamado test.exe.hashes que contém uma lista das 10 hashes do arquivo.

O cliente iria baixar o arquivo de definição de hash, e garantir que ele tem todos os blocos. O cliente pode solicitar cada bloco individualmente e depois que ele é baixado, ele pode calcular o hash em sua extremidade novamente para garantir que não haja corrupção.

Você não precisa dividir fisicamente o arquivo, dividindo um arquivo é apenas ler a parte dela que você está interessado. O primeiro bloco do arquivo é de intervalo de bytes 0 a 102399, o próximo bloco é de 102400 para 204800, e assim por diante. Então, basta abrir o arquivo, procure a essa posição, ler os dados, e feche o arquivo.

Outras dicas

Olhe para a implementação de Split e Concat (software GNU).

Você pode querer considerar o uso de codificação de Solomon-Reed. Ele vai fazer chegar os blocos finais muito mais fácil. Esta é a rota Microsoft levou em Avalaunch.

Fora de interesse: Porque não basta implementar BitTorrent ou algo parecido? Há muitos clientes Open Source (ou seja Azureus ) e o protocolo é realmente simples . Há também um artigo com um pouco mais detalhadamente , mas esta contém algumas extensões - em dúvida, o funcionário especificação está sempre certo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top