Je dois implémenter un système de middleware pour le partage de fichiers, et il doit scinder les fichiers comme ce qui se passe sur bittorrent, où il envoie et reçoit des pièces séparées simultanément à partir de sources varios. Comment je fais ça? Est-ce une bibliothèque ou dois-je implémenter le fichier moi-même?scinder des fichiers pour une application P2P
Répondre
Divisez les fichiers en blocs, disons de 100 Ko chacun. Puis calculer un hachage SHA (ou un autre algorithme de hachage) sur chacun des blocs. donc si le fichier est 905KB, vous auriez 10 de ces hachages calculés.
Le serveur contiendrait un fichier de définition de hachage pour chaque fichier qu'il sert. Ce fichier de définition de hachage contient une liste de tous les blocs du fichier, ainsi que le hachage. Donc, si le serveur sert notre fichier de 905 Ko appelé test.exe. Ensuite, nous aurions un autre fichier appelé test.exe.hashes qui contient une liste des 10 hachages du fichier.
Le client téléchargerait le fichier de définition de hachage et s'assurerait qu'il possède tous les blocs. Le client peut demander chaque bloc individuellement et après le téléchargement, il peut à nouveau calculer le hash pour s'assurer qu'il n'y a pas de corruption. Vous n'avez pas besoin de diviser physiquement le fichier, la division d'un fichier consiste simplement à lire la partie qui vous intéresse. Le premier bloc du fichier est de la plage d'octets 0 à 102399, le bloc suivant est de 102400 à 204800, et ainsi de suite. Il suffit donc d'ouvrir le fichier, de rechercher cette position, de lire les données et de fermer le fichier.
Regardez l'implémentation de Split & Concat (logiciel GNU).
bonne idée, merci! –
Vous pourriez envisager d'utiliser le codage Solomon-Reed. Cela rendra les derniers blocs beaucoup plus faciles. C'est la route empruntée par Microsoft à Avalaunch.
Pas d'intérêt: Pourquoi ne pas simplement implémenter BitTorrent ou quelque chose comme ça? Il existe de nombreux clients OpenSource (c'est-à-dire Azureus) et le protocole est really simple. Il y a aussi an article with a little more detail, mais cela contient quelques extensions - en cas de doute, la spécification officielle est toujours correcte.
fantastique, merci pour la réponse! –