UDP 洪流跟踪器不回复
UDP torrent trackers not replying
我终于到了从 UDP 跟踪器获得响应的阶段。
这是一个例子,我把它分成了一个数组:
[ 1, 3765366842, 1908, 0, 2, 0 ]
Action, request ID, interval, leechers, seeders, peers.
无论我选择哪个 torrent,我都会得到 1/2 的播种者,我假设这是服务器跟踪我,没有同行/leechers。
我没有使用正确的信息哈希吗?
这就是我从磁铁中取回它的方法link:
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]
不需要对它进行编码,所以我将它与我的请求一起发送。
唯一的麻烦点就到这里了,其实看起来很简单...
9f91
应该导致前两个字节为 159、145,因此您的十六进制解码不正确。
除此之外,您应该通过 wireshark 将您的实现与工作的实现进行比较。
正如在对另一个问题的回答中提到的,官方和最新规范位于 bittorrent.org,其中包括 UDP 跟踪器规范。 xbtt 页面未维护。
正如the8472所说,你的解码不正确:
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');
我终于到了从 UDP 跟踪器获得响应的阶段。
这是一个例子,我把它分成了一个数组:
[ 1, 3765366842, 1908, 0, 2, 0 ]
Action, request ID, interval, leechers, seeders, peers.
无论我选择哪个 torrent,我都会得到 1/2 的播种者,我假设这是服务器跟踪我,没有同行/leechers。
我没有使用正确的信息哈希吗?
这就是我从磁铁中取回它的方法link:
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]
不需要对它进行编码,所以我将它与我的请求一起发送。
唯一的麻烦点就到这里了,其实看起来很简单...
9f91
应该导致前两个字节为 159、145,因此您的十六进制解码不正确。
除此之外,您应该通过 wireshark 将您的实现与工作的实现进行比较。
正如在对另一个问题的回答中提到的,官方和最新规范位于 bittorrent.org,其中包括 UDP 跟踪器规范。 xbtt 页面未维护。
正如the8472所说,你的解码不正确:
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');