Я строю клиент Bittorrent с помощью Node.js и терплю неудачу в получении ответа от сверстников над расширением PWP метаданных (BEP 0009)Как получить ответы на запрос части ut_metadata? (Node.js Bit Torrent BEP 0009)
я получаю сверстникам из DHT (BEP 0005) (где я объявляю), затем отправьте Handshake и Extended Handshake поверх PWP с помощью сетевого гнезда.
buildHandshake = (torrent, ext) => { // torrent contains mainly infoHash
const buf = Buffer.alloc(68)
buf.writeUInt8(19, 0)
buf.write('BitTorrent protocol', 1)
if (ext) {
const big = new Uint64BE(1048576)
big.toBuffer().copy(buf, 20)
} else {
buf.writeUInt32BE(0, 20)
buf.writeUInt32BE(0, 24)
}
torrent.infoHashBuffer.copy(buf, 28)
anon.nodeId().copy(buf, 48) // tool that generates a nodeId once.
return buf
}
buildExtRequest = (id, msg) => {
const size = msg.length + 1
const buf = Buffer.alloc(size + 5)
buf.writeUInt32BE(size, 0)
buf.writeUInt8(20, 4)
buf.writeUInt8(id, 5)
msg.copy(buf, 6)
return buf
}
const client = new net.Socket()
client.connect(peer.port, peer.ip,() => {
client.write(buildHandshake(torrent, true))
const extHandshake = bencode.encode({
m: {
ut_metadata: 2,
},
metadata_size: self.metaDataSize, // 0 by default
p: client.localPort,
v: Buffer.from('Hypertube 0.1')
})
client.write(buildExtRequest(0, extHandshake))
})
Отсюда, я получаю Рукопожатия и расширенные Hanshakes назад (а иногда Битовые поля), то я требуют части метаданных:
const req = bencode.encode({ msg_type: 0, piece: 0 })
// utMetadata is from extended Handshake dictionary m.ut_metadata
client.write(message.buildExtRequest(utMetadata, req))
После чего, я не слышал от сверстников больше. После 2 минут без сохранения времени ожидания соединения.
У кого-нибудь есть идея, почему я не получаю ответа?
Вы пытались использовать WireShark и сравнить с рабочим клиентом? – Encombe
будет полезен hexdump вашего и их сообщений – the8472
Я работал над Wireshark и выяснил, в чем проблема: bencode.encode будет кодировать ключ без значения, если значение не определено, и не будет бросать ошибку. Это и странно, префикс длины отсутствовал один байт, превращая следующие сообщения в не расширенные, а скорее _interested_ или _unchoke_, неправильно сформированные, в результате чего сверстник закрывается. –