2009-07-09 115 views
2

我一直在写一个BitTorrent客户端时有点闲暇,主要是出于好奇,但部分原因是希望提高我的c#技能。BitTorrent跟踪器发布问题

我一直在使用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=&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(); 

回答

2

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

1

究竟什么是你哈希?你只应该散列info部分,而不是整个torrent文件...所以基本上,解码文件,重新编码info部分,散列。

即。对于洪流贴,你应该是散列是:

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

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

那里有开源的基于PHP的洪流追踪器。它们的效率非常低(我知道,我为当天的回写机制编写了一个缓存机制),但是您可以设置自己的本地跟踪器并修改PHP代码,以便在与跟踪器通信时调试客户端。拥有本地客户端服务器设置将使故障排除变得更容易。

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的地址栏它可能是由浏览器会自动修正。