Question

J'ai été jeter un peu de temps libre à écrire un client BitTorrent, la plupart du temps par curiosité, mais en partie par le désir d'améliorer mes compétences en C #.

Je me sers la théorie wiki comme guide. J'ai construit une bibliothèque de classes pour le traitement BEncoding, que je suis tout à fait confiant dans; essentiellement parce que le contrôle de la santé mentale est de régénérer le fichier .torrent d'origine de ma représentation interne immédiatement après l'analyse syntaxique, puis hachage et comparer.

La prochaine étape est d'obtenir traqueur de travail annonce la. Ici, je frappe une pierre d'achoppement, parce que les trackers rejettent mes demandes sans message d'erreur terriblement utiles.

Prenons, par exemple, dernière sauvegarde de base de données de débordement de pile . Mon code génère l'URI annonce suivante:

http://208.106.250.207:8192/announce?info_hash=-%CA8%C1%C9rDb%ADL%ED%B4%2A%15i%80Z%B8%F%C&peer_id=01234567890123456789&port=6881&uploaded=0&downloaded=0&left=0&compact=0&no_peer_id=0&event=started

La réponse du suivi à mon code:

d14:failure reason32:invalid info hash and/or peer ide

La réponse du tracker pour cette chaîne est tombé dans la barre d'adresse de Chrome:

d8:completei2e11:external ip13:168.7.249.11110:incompletei0e8:intervali600e5:peerslee

Le peer_id est (valide) ordures, mais changer quelque chose sensible (se faisant passer pour un client largement utilisé) ne change rien.

Comme je l'ai dit, je suis sûr que je tire le dictionnaire d'information correctement et hachant (SHA1) comme je le devrais, et l'identifiant par les pairs est bien formé.

Je pense que je fais quelque chose de mineur bêtement mal, et apprécierait toute aide à repérer ce qu'il est exactement.

Son genre de difficile à deviner quel code serait pertinent (et il y a beaucoup de choses à juste après). Cependant, je vais essayer de poster quoi que ce soit demandé.

EDIT Je ne Codage hexadécimal la info_hash, quel type d'aide.

Ceci est le code qui prend l'URI génère et essayer de chercher une réponse:

//uri is the above
WebRequest req = WebRequest.Create(uri);
WebResponse resp = req.GetResponse();
Stream stream = resp.GetResponseStream();
Était-ce utile?

La solution

MonoTorrent est une implémentation BitTorrent qui vient avec Mono. Dans le classe HTTPTracker il existe une méthode de CreateAnnounceString. Peut-être vous pouvez comparer votre mise en œuvre avec la façon dont cette méthode est de le faire? (Vous avez probablement besoin de traquer où l'instance AnnounceParameters est créé.)

Autres conseils

Ce n'est pas une réponse à votre problème, mais il peut aider pour le test.

Il y a trackers torrent en PHP open-source là-bas. Ils sont incroyablement inefficaces (je sais, je l'ai écrit un mécanisme de mise en cache pour un retour dans la journée), mais vous pouvez configurer votre propre tracker local et modifier le code PHP pour aider déboguer votre client, car il communique avec le système de suivi. Avoir une configuration client-serveur local serait dépannage beaucoup plus facile.

Qu'est-ce que vous exactement Hashage? Vous ne devez hacher la section info, pas tout fichier torrent ... Donc, fondamentalement, décoder le fichier, réencoder la section info, hachage.

à savoir

. Pour le torrent affiché, tout ce que vous devez être le hachage est:

d6:lengthi241671490e4:name20:so-export-2009-07.7z12:piece lengthi262144e6:pieces18440:<lots of binary data>e

Il y a une erreur dans l'URL% -encoding du info_hash. Les zéros dans les deux derniers octets du info_hash a été supprimé.

It is:     info_hash=-%CA8%C1%C9rDb%ADL%ED%B4%2A%15i%80Z%B8%F%C
Should be: info_hash=-%CA8%C1%C9rDb%ADL%ED%B4%2A%15i%80Z%B8%0F%0C  

Lorsque la chaîne annonce est lâchée dans la barre d'adresse de Chrome, il est probablement corrigé automatiquement par le navigateur.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top