2

我一直在写一个 BitTorrent 客户端,主要是出于好奇,但部分是出于提高我的 c# 技能的愿望。

我一直使用理论维基作为我的指南。我已经建立了一个处理 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&事件=开始

跟踪器对我的代码的响应:

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 格式正确。

我的猜测是我在做一些愚蠢的小事,如果能帮助我找出它的确切含义,我将不胜感激。

很难猜测什么代码是相关的(而且要发布的内容很多)。但是,我会尝试发布任何要求的内容。

编辑
我没有对 info_hash 进行十六进制编码,这有帮助。

这是获取生成 URI 并尝试获取响应的代码:

//uri is the above
WebRequest req = WebRequest.Create(uri);
WebResponse resp = req.GetResponse();
Stream stream = resp.GetResponseStream();
4

4 回答 4

2

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

于 2009-07-09T01:00:32.807 回答
1

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

IE。对于发布的洪流,您应该散列的是:

d6:lengthi241671490e4:name20:so-export-2009-07.7z12:piece lengthi262144e6:pieces18440:<lots of binary data>e
于 2009-07-09T00:43:47.260 回答
1

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

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

于 2009-07-09T01:02:29.547 回答
1

info_hash 的 URL %-encoding 有错误。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 的地址栏中时,它可能会被浏览器自动更正。

于 2016-10-16T05:56:59.303 回答