2009-07-09 121 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的地址欄它可能是由瀏覽器會自動修正。