Я написал следующую функцию:
let responses = {}
let socks = {}
module.ping = function (port, address) {
//console.log(`Ping function was called - ${address} ${port}`)
if (socks[`${address}:${port}`]) {
//console.log("Using existing socket")
responses[`${address}:${port}`] = false
sock = socks[`${address}:${port}`]
sock.write('PING\n')
console.log(`Sent PING to ${address} ${port}`)
}
else {
sock = new net.Socket();
responses[`${address}:${port}`] = false
sock.connect(port, address, async function() {
sock.write('PING\n')
console.log(`Sent PING to ${address} ${port}`)
});
// Response listeners
sock.on('data', function(data) {
clean_data = data.toString().replace(/\n/g, '').replace(/\r/g, '')
console.log(`[${sock.remoteAddress}:${sock.remotePort}] Received ${clean_data}`)
if (clean_data == 'PONG') {
//console.log(`[${sock.remoteAddress}:${sock.remotePort}] Received PONG`)
//sock.end()
//delete socks[`${address}:${port}`]
responses[`${sock.remoteAddress}:${sock.remotePort}`] = true
}
}
});
sock.on('error', function(error) {
if (sock.remoteAddress) {
responses[`${sock.remoteAddress}:${sock.remotePort}`] = false
}
sock.destroy()
delete socks[`${address}:${port}`]
});
// Add to list of sockets
if (sock) {
socks[`${address}:${port}`] = sock
}
}
}
С другой стороны, у меня есть прослушивающий TCP-сервер, который просто отвечает «PONG \ n». Когда я пробую один хост, я получаю ожидаемый вывод:
module.ping(1337, 10.0.0.100)
await delay(5000) // Custom function
module.ping(1337, 10.0.0.100)
Отправлено PING на 10.0.0.100 1337
[10.0.0.100:1337] Получено PONG
Отправлено PING на 10.0.0.100 1337
[10.0.0.100:1337] Получено PONG
Однако, когда я пытаюсь поразить несколько хостов:
module.ping(1337, 10.0.0.100)
module.ping(1337, 10.0.0.200)
await delay(5000) // Custom function
module.ping(1337, 10.0.0.100)
module.ping(1337, 10.0.0.200)
Отправлено PING на 10.0.0.100 1337
Отправлено PING на 10.0.0.200 1337
[10.0.0.200:1337] Получено PONG
[10.0.0.200:1337] Получено PONG
Отправлено PING на 10.0.0.100 1337
Отправлено PING на 10.0.0.200 1337
[10.0.0.200:1337] Получено PONG
[10.0.0.200:1337] Получено PONG
Мне кажется, что прослушиватель событий для "данных", который я добавил, каким-то образом привязан к неверному адресу в моем коде, однако я не могу 'не вижу где. Если я добавлю больше хостов в список, последним хостом с отправленным PING будет тот, для которого все PONG помечены как часть.