我一直在写一个 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();