我想在java中編寫我自己的bittorrent客戶端,它是一個使工作項目更新我的java技能。我一直在發展中的某個階段被卡住,雖然有些論壇可以用來進行bittorrent開發,但它們似乎並不是非常活躍。BitTorrent擴展協議
到目前爲止,我可以做到以下幾點:
- 獲得同齡人的名單,從跟蹤網站
- 連接到對等
- 發送「握手」消息
- 收到「握手」回覆消息
- 發送'有興趣'消息。
- 收到'Unchoke'消息。
我遇到的問題是如果我在發送'感興趣'消息之前嘗試向對方發送擴展數據(http://www.bittorrent.org/beps/bep_0010.html)。該協議聲明您必須在收到握手後立即發送擴展數據。 如果我將擴展數據發送給對等端,對端立即關閉連接,即在Wireshark中,我看到一個FIN,ACK。 我已經使用Wireshark和uTorrent來查看正在發送什麼擴展數據,並試圖複製該數據,但無濟於事。我嘗試了擴展數據參數的所有不同組合,但無論我做什麼,我都無法超越這一點。
下面是一個擴展數據消息的例子,它是從Wireshark複製而來的。
D1:ei0e4:IPV44:czH12:complete_agoi-1E1:MD11:upload_onlyi3e11:lt_donthavei7e12:ut_holepunchi4e11:ut_metadatai2e6:ut_pexi1e10:ut_commenti6ee1:pi43276e4:reqqi255e1:V13:洪流3.52:ypi48680e6:yourip4:JFE
這裏是我的客戶的擴展數據,不起作用。順便說一句,我已經檢查,以確保ip變量是正確的(他們被髮送爲4字節)。
D1:ei0e4:IPV44:czH12:complete_agoi-1E1:MD11:upload_onlyi3e11:lt_donthavei7e12:ut_holepunchi4e11:ut_metadatai2e6:ut_pexi1e10:ut_commenti6ee1:pi51361e4:reqqi255e1:V15:MyTorrent v0.152:ypi40898e6:yourip4:ROÈ
另外,一旦我收到'Unchoke'消息,我就能夠成功地檢索碎片。
任何信息將不勝感激。
你可以發佈數據爲十六進制+ ascii視圖。 bencoding是二進制的,像一個字符串發佈可能會破壞它。您是否使用經過測試的本碼編碼實現來創建擴展握手?以及爲什麼要複製遠程對等方的握手而不是按照規範使用唯一的必填字段來創建它? – the8472
我沒有保存wireshark捕獲,我可以做更多的測試,並複製和粘貼hex和ascii視圖,但我可以向你保證我發給你的數據中的所有信息都是有效的。至於擴展協議的強制性字段,我認爲沒有任何規定,根據我在規範中閱讀的內容,它們都是可選的。正如我所提到的,我已經嘗試了不同的參數組合,例如,只發送我通過BitComet等其他應用程序發送的參數,但沒有任何效果。我知道我發送了不好的數據(我不認爲它是腐敗的),我只是不知道如何弄清楚它是什麼。 –
Wireshark捕獲仍然是最容易診斷的 – the8472