我一直在写一个BitTorrent客户端,主要是出于好奇,但部分原因是出于提高我的c#技能的愿望。
我一直在使用the theory wiki作为我的向导。我已经建立了一个处理BEncoding的类库,我非常有信心;基本上是因为完整性检查是在解析后立即从我的内部表示中重新生成原始的.torrent文件,然后进行哈希和比较。
下一阶段是让跟踪器宣布正常工作。在这里,我遇到了一个绊脚石,因为跟踪器拒绝了我的请求而没有非常有用的错误消息。
例如,latest stack overflow database dump。我的代码生成以下通告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)就像我应该的那样,并且对等身份很好。
我的猜测是,我正在做一些愚蠢错误的小事,并且非常感谢任何有助于发现它的确切内容。
很难猜出哪些代码是相关的(并且发布的内容远远不够)。但是,我会尝试发布任何要求的内容。
修改
我不是编码info_hash的十六进制编码,这有点帮助。
这是获取生成URI并尝试获取响应的代码:
//uri is the above
WebRequest req = WebRequest.Create(uri);
WebResponse resp = req.GetResponse();
Stream stream = resp.GetResponseStream();
答案 0 :(得分:2)
MonoTorrent是Mono附带的BitTorrent实现。
在HTTPTracker class中有CreateAnnounceString
方法。
也许您可以将您的实现与该方法的实现方式进行比较?
(您可能需要寻找创建AnnounceParameters
实例的位置。)
答案 1 :(得分:1)
你到底在做什么?你应该只对info
部分进行散列,而不是整个torrent文件...所以基本上,解码文件,重新编码info
部分,哈希。
即。对于发布的torrent,你应该散列的是:
d6:lengthi241671490e4:name20:so-export-2009-07.7z12:piece lengthi262144e6:pieces18440:<lots of binary data>e
答案 2 :(得分:1)
这不是您的问题的答案,但它可能有助于测试。
有基于PHP的开源torrent跟踪器。它们非常低效(我知道,我在当天为一个人编写了一个缓存机制),但您可以设置自己的本地跟踪器并修改PHP代码以帮助调试客户端与跟踪器通信。设置本地客户端 - 服务器可以使故障排除变得更加容易。
答案 3 :(得分:1)
info_hash的网址%-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的地址栏时,它可能会被浏览器自动更正。