比特Torrent跟踪器公告问题

3
我花了一点业余时间写一个BitTorrent客户端,主要是出于好奇心,但也有一部分是为了提高我的c#技能。
我使用理论wiki作为指南。我建立了一个处理BEncoding的类库,我对此非常自信;基本上是因为健全性检查是在解析后立即从我的内部表示重新生成原始.torrent文件,然后进行哈希和比较。
下一步是使追踪器公告工作。在这里,我遇到了一个障碍,因为追踪器拒绝我的请求,并没有太有用的错误消息。
例如,最新的堆栈溢出数据库转储。我的代码生成以下公告URI:
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
跟踪器对我的代码的响应:
d14:failure reason32:invalid info hash and/or peer ide
将该字符串放入Chrome地址栏中后,跟踪器的响应如下:
d8:completei2e11:external ip13:168.7.249.11110:incompletei0e8:intervali600e5:peerslee
peer_id是(有效的)垃圾,但将其更改为有意义的内容(冒充广泛使用的客户端)并没有改变任何东西。
就像我说的那样,我相当确定我正在正确地提取信息字典并进行哈希(SHA1),并且对等方ID格式良好。
我猜我正在做一些微小的愚蠢错误,并且希望在发现到底是什么时能得到任何帮助。
很难猜测哪些代码是相关的(而且有太多要发布)。但是,我会尽力发布所需的任何内容。 < p > < em >编辑
我没有对info_hash进行十六进制编码,这有点有帮助。
以下是生成URI并尝试获取响应的代码:
//uri is the above
WebRequest req = WebRequest.Create(uri);
WebResponse resp = req.GetResponse();
Stream stream = resp.GetResponseStream();
4个回答

3

MonoTorrent是一个带有Mono的BitTorrent实现。 在HTTPTracker类中,有一个CreateAnnounceString方法。 也许你可以将你的实现与该方法进行比较? (你可能需要查找创建AnnounceParameters实例的位置。)


1

你到底要哈希什么?你应该只哈希info部分,而不是整个种子文件... 所以基本上,解码文件,重新编码info部分,然后哈希。

例如,对于发布的种子,你应该哈希的只有:

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

1

这不是解决您问题的答案,但它可能有助于测试。

有一些开源的基于PHP的种子追踪器。它们效率非常低(我知道,我曾经为其中一个编写了缓存机制),但您可以设置自己的本地追踪器并修改PHP代码以帮助调试客户端与追踪器之间的通信。拥有本地客户端-服务器设置将使故障排除变得更加容易。


1

URL的%-编码中存在错误。info_hash的最后两个字节中的前导零已被删除。

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  

当公告字符串被放入Chrome的地址栏时,浏览器可能会自动纠正它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接