【发布时间】:2017-04-20 19:51:33
【问题描述】:
我正在尝试用 java 编写自己的 bittorrent 客户端,这是一个让我刷新 java 技能的工作项目。我一直被困在某个开发点上,尽管有一些论坛可以进行 bittorrent 开发,但它们似乎并不活跃。
到目前为止,我可以做到以下几点:
- 从 Tracker 站点获取对等点列表
- 连接到对等体
- 发送“握手”消息
- 接收回“握手”消息
- 发送“有兴趣”消息。
- 收到回复“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:Torrent 3.52 3.52
这是来自我的客户端的扩展数据,它不起作用。顺便说一句,我已检查以确保 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:40 eTorrent v861:你的eqqi255e1:ip24:40 /strong>
此外,一旦我收到“Unchoke”消息,我就能成功检索碎片。
任何信息将不胜感激。
【问题讨论】:
-
您可以将数据发布为 hex + ascii 视图。 bencoding 是二进制的,像字符串一样发布它可能会损坏它。您是否使用经过测试的编码实现来创建扩展握手?为什么要复制远程对等方的握手,而不是根据规范仅使用必填字段来创建它?
-
我没有保存wireshark捕获,我可以做更多的测试并复制和粘贴十六进制和ASCII视图,但我可以向你保证我发送给你的数据中的所有信息都是有效的。至于扩展协议的必填字段,我认为没有,根据我在规范中阅读的内容,它们都是可选的。正如我所提到的,我尝试了不同的参数组合,例如,只发送我看到的其他应用程序(如 BitComet)发送的参数,但没有任何效果。我知道我正在发送错误数据(我不认为它已损坏),我只是不知道如何弄清楚它是什么。
-
wireshark 捕获仍然是最容易诊断的
-
我看不到如何将文件附加到我的问题中,显示wireshark 捕获的最佳方式是什么?
标签: java bittorrent