我只是想从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
基于this文档,但我没有得到任何回复。我甚至尝试过Wireshark来检查是否有任何数据包回来,但仍然没有。 为什么μTorrent不跟我说话?
答案 0 :(得分:3)
哈希应该是二进制的。在bencoding中,数字+冒号是字符串的长度前缀。十六进制中的sha1长度为40个字节,因为它实际上是20个字节长,它需要是散列函数的原始输出。
你基本上需要将十六进制字符串转换为二进制(40 hex - > 20二进制)才能工作。
答案 1 :(得分: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
请注意,您从节点获得的响应将是未转义的二进制文件,不一定是文本,因此我们在此处直接将其显示在您的终端中可能会导致出现奇怪的事情或您当前的终端会话被某种方式搞砸了