BitTorrent UDP Tracker Protocolを使用して、tracker.publicbt.com や tracker.openbittorrent.com などのパブリック UDP トラッカーから UDP スクレイピングを実行しようとしています。私のアプリは、トラッカーに connection_id のリクエストを送信し、その ID を使用してスクレイプを実行します。スクレイプ応答はトラッカーから返され、パケットの形式が正しくないことを示すエラーはありませんが、使用する info_hash に関係なく、シーダー、リーチャー、および完了の数に対して「0」が返されます。
パケットが適切なサイズであること、info_hash が正しいオフセットから開始すること、データがすべて正しいことを徹底的にチェックしました。私が見る限り、パケットの作成と送信に問題はありません。この質問は数日間開かれており、回答が得られていないため、誰かが助けてくれることを期待して、以下のコード例を更新および編集しました.
次の例では、info_hash をハードコーディングしました。コマンド ラインで実行すると、このコードはトラッカーに接続し、connection_id を取得してから、Ubuntu torrent info_hash でスクレイプを実行し、さまざまな情報をコンソールに出力します。
connection_id は 64 ビット整数であるため、2 つの部分に分割されます。
var dgram = require('dgram'), サーバー = 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) { もし (エラー) { console.log(err.message); } }); }、 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); sendPacket (buf、ホスト、ポート); }、 ScrapeTorrent = 関数 (ホスト、ポート、ハッシュ) { "厳密を使用"; var buf = 新しいバッファ(56), tmp = ''; infoHash = ハッシュ; if (!transactionId) { startConnection(ホスト、ポート); } そうしないと { 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(infoHash); console.log(buf.toString('utf8', 16, buf.length)); // スクレイピングする sendPacket (buf、ホスト、ポート); transactionId = null; infoHash = null; } }; server.on("メッセージ", 関数 (msg, rinfo) { "厳密を使用"; var buf = new Buffer(msg), シーダー、 完了、 リーチャー; console.log(rinfo); アクション = buf.readUInt32BE(0, 4); transactionId = buf.readUInt32BE(4, 4); console.log("返されたアクション: " + アクション); console.log("返された transactionId: " + transactionId); if (アクション === ACTION_CONNECT) { console.log("接続応答"); connectionIdHigh = buf.readUInt32BE(8, 4); connectionIdLow = buf.readUInt32BE(12, 4); スクレイプトレント(トラッカーホスト、トラッカーポート、インフォハッシュ); } それ以外の場合 (アクション === ACTION_SCRAPE) { console.log("スクレイプ応答"); シーダー = buf.readUInt32BE(8, 4); 完了 = buf.readUInt32BE(12, 4); リーチャー = buf.readUInt32BE(16, 4); console.log(シーダー); console.log(完了); console.log(リーチャー); } その他の場合 (アクション === ACTION_ERROR) { console.log("エラー応答"); } }); server.on("リスニング", function () { "厳密を使用"; var アドレス = server.address(); console.log("サーバーのリッスン" + address.address + ":" + address.port); }); サーバー.バインド(); ScrapeTorrent(trackerHost, trackerPort, "335990D615594B9BE409CCFEB95864E24EC702C7");