我只是想从 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不跟我说话?
哈希应该以二进制为单位。在bencoding中,数字 结肠是字符串的长度前缀。十六进制中的sha1长40个字节,实际上要长20个字节,它需要是哈希函数的原始输出。
您基本上需要将十六进制字符串转换为二进制(40 hex-> 20二进制)才能工作。
如其他答案中所述,bencoding是二进制格式,而不是文本格式。您似乎正在尝试使用终端输入消息主体进入NetCat。终端是为了输入程序而不是二进制的文本输入而设计的,因此您将无法将该序列直接输入NetCat的stdin。
。您的ping请求中的ID不应是Torrent的Infohash。将您的客户端识别到DHT网络应该是独特的ID。为了进行测试,您真的可以选择一个完全由20个ASCII字符组成的ID,并避免使用这些编码问题,但是实际上,您需要使用统一的随机二进制ID。
如果要在终端中使用二进制ID,则不应尝试将其直接输入NetCat。取而代之的是,您可以使用Shell的echo
命令和十六进制编码以预期格式生成数据,然后将其输送到NetCat中。例如,在bash中:
echo -n $'d1:ad2:id20:x23x71x0cx1cxb4x50x7dx87x29xb8x3fx87x2cxc6xa2xa4x4cx39x73x67e1:q4:ping1:t1:01:y1:qe' | nc -u router.utorrent.com 6881
请注意,您从节点获得的响应将是不渗透的二进制文件,不一定是文本,因此直接在您的终端显示它可能会导致事物看起来很奇怪,或者您当前的终端会话被某种方式弄乱了。