Pap*_*ppa 3 javascript bittorrent udp node.js
我正在尝试使用BitTorrent UDP 跟踪器协议从公共 UDP 跟踪器(例如 tracker.publicbt.com 或 tracker.openbittorrent.com)执行 UDP 抓取。我的应用程序向跟踪器发送一个 connection_id 请求,并使用该 ID 执行抓取。抓取响应从跟踪器返回,没有错误表明数据包格式错误,但无论我使用什么 info_hash,我都会返回“0”作为播种者、吸血者和完成者的数量。
我已经彻底检查了数据包的大小是否正确,info_hash 是否以正确的偏移量开始,以及数据是否全部正确。据我所知,创建和发送数据包没有问题。这个问题几天来一直没有得到解答,所以我更新并编辑了下面的代码示例,希望有人能提供帮助。
我已将 info_hash 硬编码到以下示例中。在命令行上运行时,此代码应连接到跟踪器,获取 connection_id,然后在 Ubuntu 种子 info_hash 上执行抓取,将各种信息输出到控制台。
connection_id 被分成 2 部分,因为它是一个 64 位整数。
var dgram = require('dgram'),
server = dgram.createSocket("udp4"),
connectionIdHigh = 0x417,
connectionIdLow = 0x27101980,
交易 ID,
行动,
trackerHost = "tracker.publicbt.com",
跟踪端口 = 80,
infoHash = "",
ACTION_CONNECT = 0,
ACTION_ANNOUNCE = 1,
ACTION_SCRAPE = 2,
ACTION_ERROR = 3,
sendPacket = 函数(缓冲区,主机,端口){
“严格使用”;
server.send(buf, 0, buf.length, port, host, function(err, bytes) {
如果(错误){
控制台日志(错误消息);
}
});
},
startConnection = 函数(主机,端口){
“严格使用”;
var buf = 新缓冲区(16);
transactionId = Math.floor((Math.random()*100000)+1);
buf.fill(0);
buf.writeUInt32BE(connectionIdHigh, 0);
buf.writeUInt32BE(connectionIdLow, 4);
buf.writeUInt32BE(ACTION_CONNECT, 8);
buf.writeUInt32BE(transactionId, 12);
发送数据包(缓冲区,主机,端口);
},
scrapeTorrent = 函数(主机、端口、哈希){
“严格使用”;
var buf = 新缓冲区(56),
tmp = '';
信息哈希 = 哈希;
如果 (!transactionId) {
开始连接(主机,端口);
} 别的 {
buf.fill(0);
buf.writeUInt32BE(connectionIdHigh, 0);
buf.writeUInt32BE(connectionIdLow, 4);
buf.writeUInt32BE(ACTION_SCRAPE, 8);
buf.writeUInt32BE(transactionId, 12);
buf.write(infoHash, 16, buf.length);
控制台日志(信息哈希);
console.log(buf.toString('utf8', 16, buf.length));
// 进行刮擦
发送数据包(缓冲区,主机,端口);
交易 ID = 空;
infoHash = null;
}
};
server.on("message", function (msg, rinfo) {
“严格使用”;
var buf = 新缓冲区(味精),
播种机,
完全的,
水蛭;
控制台日志(rinfo);
动作 = buf.readUInt32BE(0, 4);
transactionId = buf.readUInt32BE(4, 4);
console.log("返回的动作:" + action);
console.log("返回的transactionId:" + transactionId);
如果(动作 === ACTION_CONNECT){
console.log("连接响应");
connectionIdHigh = buf.readUInt32BE(8, 4);
connectionIdLow = buf.readUInt32BE(12, 4);
scrapeTorrent(trackerHost, trackerPort, infoHash);
} else if (action === ACTION_SCRAPE) {
console.log("抓取响应");
播种机 = buf.readUInt32BE(8, 4);
完成 = buf.readUInt32BE(12, 4);
leechers = buf.readUInt32BE(16, 4);
控制台日志(播种机);
控制台日志(已完成);
控制台日志(水蛭);
} else if (action === ACTION_ERROR) {
console.log("错误响应");
}
});
server.on(“听”,函数(){
“严格使用”;
var address = server.address();
console.log("服务器监听" + address.address + ":" + address.port);
});
服务器绑定();
scrapeTorrent(trackerHost,trackerPort,“335990D615594B9BE409CCFEB95864E24EC702C7”);
我终于解决了这个问题,并因为没有早点意识到而自责。
info_hash 是一个十六进制编码的字符串,所以当它被写入缓冲区时需要设置它的编码。例如:
buf.write(infoHash, 16, buf.length, 'hex');
Run Code Online (Sandbox Code Playgroud)
UDP 跟踪器协议没有提及所需的编码,只是将其描述为 20 字节的字符串。希望这个问答可以帮助遇到同样问题的其他人。
| 归档时间: |
|
| 查看次数: |
811 次 |
| 最近记录: |