我终于到达了从UDP跟踪器获得响应的阶段。
这是一个例子,我分成了一个数组:
[1,3765366842,1908,0,2,0]
Action, request ID, interval, leechers, seeders, peers.
无论我选择哪种种子,我都会得到1/2播种机,我假设它是跟踪我的服务器,而没有同伴/ leechers。
我没有使用正确的信息哈希吗?
这是我从磁铁链接中检索它的方式:
magnet:?xt=urn:btih:9f9165d9a281a9b8e782cd5176bbcc8256fd1871&dn=Ubuntu+16.04.1+LTS+Desktop+64-bit&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969
...
h = 9f9165d9a281a9b8e782cd5176bbcc8256fd1871
现在我将其拆分为两个块,并解析它们,以换算十六进制字节:
bytes = [];
for (var i = 0; i < h.length; i++) bytes.push(parseInt((h[i]) + h[i++], 16));
[153,153,102,221,170,136,170,187,238,136,204,85,119,187,204,136,85,255,17,119]
没有必要对此进行编码,因此我将其与我的请求一起发送。
这是造成麻烦的唯一一点,但似乎很简单......
答案 0 :(得分:1)
正如8472所说,你的解码不正确:
for (var i = 0; i < h.length; i++) bytes.push(parseInt((h[i]) + h[i++], 16));
i
和i++
在此处具有相同的值。 (避免使用聪明的内联内容的原因之一。)您可以使用i
和++i
,也可以将其全部展开为多行以提高可读性:
for (var i = 0; i < h.length; i += 2) {
var hex = h.substr(i, 2);
bytes.push(parseInt(hex, 16));
}
如果您正在使用Node,只需将其解析为Buffer
,如果需要,可以很容易地将其转换为数组:
var bytes = Buffer.from(h, 'hex');
答案 1 :(得分:0)
9f91
应该导致前两个字节为159,145,因此十六进制解码不正确。
除此之外,您应该通过wireshark将您的实施与工作实施进行比较。
正如在另一个问题的答案中已经提到的,官方和最新的规范驻留在bittorrent.org,其中包括UDP跟踪器规范。不维护xbtt页面。