我想在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