使用netcat Ping router.utorrent.com DHT节点

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不与我通信呢?
2个回答

3

哈希值应该是二进制的。在bencoding中,数字+冒号是字符串的长度前缀。sha1十六进制为40字节长,要使其实际上为20字节长,它需要是哈希函数的原始输出。

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


谢谢您的回复。能够详细解释一下吗?我对此很陌生。我需要对上述哈希做些什么? - Cadell Christo
不需要了,我已经在我的回答中写过了:40字节的十六进制转换成20字节的原始二进制。 - the8472
不好意思,我并不想让你感到烦恼。我只是想弄清楚这个问题。我将十六进制数a78c852bcc0379e612e1bd794e1fd19061b84d11转换成了二进制数10010100111000011111110100011001000001100001101110000000000000000000,是否正确?然后我该怎么做呢? - Cadell Christo
二进制。8位表示法。十六进制解码。使用基256而不是基16或基2。 - the8472
1
此外,在DHT消息中,“id”参数应该是您随机选择的节点ID,不需要将info-hash粘在那里。 - Arvid
显示剩余3条评论

1
正如其他答案所解释的那样,bencoding是一种二进制格式,而不是文本格式。您似乎正在尝试使用终端将消息正文输入到netcat中。终端是为向程序输入文本输入而设计的,而不是二进制输入,因此您将无法直接将该序列输入netcat的stdin。
您ping请求中的ID不应该是torrent的infohash。它应该是一个唯一的ID,用于将您的客户端标识给DHT网络。对于测试,您可以选择完全由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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接