4

我只是想得到一个响应,router.utorrent.com以便可能使 DHT 服务走上正轨。例如,给定一个磁铁链接:

xt=urn:btih:a78c852bcc0379e612e1bd794e1fd19061b84d11

哈希是:

a78c852bcc0379e612e1bd794e1fd19061b84d11

然后在终端中我输入了这个:

nc -u router.utorrent.com 6881


d1:ad2:id20:a78c852bcc0379e612e1bd794e1fd19061b84d11e1:q4:ping1:t1:01:y1:qe

基于文档,但我没有得到任何回应。我什至尝试使用 Wireshark 检查是否有任何数据包返回,但仍然没有。为什么 μTorrent 不跟我说话?

4

2 回答 2

3

哈希应该是二进制的。在编码中,数字 + 冒号是字符串的长度前缀。一个十六进制的 sha1 是 40 字节长,它实际上是 20 字节长,它需要是散列函数的原始输出。

您基本上需要将十六进制字符串转换为二进制(40 hex -> 20 二进制)才能工作。

于 2012-10-29T22:32:42.433 回答
1

正如另一个答案中所解释的,bencoding 是一种二进制格式,而不是文本格式。您似乎正在尝试使用终端将消息正文输入 netcat。终端设计用于向程序输入文本输入,而不是二进制输入,因此您将无法直接将该序列输入到 netcat 的标准输入中。

您的 ping 请求中的 ID 不应是 torrent 的 infohash。它应该是用于向 DHT 网络识别您的客户端的唯一 ID。对于测试,您确实可以只选择一个完全由 20 个 ASCII 字符组成的 ID,并避免这些编码问题,但实际上您会希望使用统一随机的二进制 ID。

如果您想在终端中输入二进制 ID,则不应尝试将其直接输入 netcat。相反,您可以使用 shell 的echo命令和十六进制编码以预期格式生成数据,并将其通过管道传输到 netcat。例如,在 bash 中:

echo -n $'d1:ad2:id20:\x23\x71\x0c\x1c\xb4\x50\x7d\x87\x29\xb8\x3f\x87\x2c\xc6\xa2\xa4\x4c\x39\x73\x67e1:q4:ping1:t1:01:y1:qe' | nc -u router.utorrent.com 6881

请注意,您从节点获得的响应将是未转义的二进制文件,不一定是文本,因此像我们在这里所做的那样直接在您的终端中显示它可能会导致事情出现奇怪或您当前的终端会话以某种方式混乱。

于 2014-03-07T18:24:39.460 回答