我正在使用Node.js中的核心net
模块编写一个简单的端口扫描程序。我的代码中出现'回调已被调用'错误。你能否发现错误的来源?以下是我的代码:
const net = require('net')
const async = require('async')
function findPortStatus(host, port, timeout, cb) {
const socket = new net.Socket()
socket.setTimeout(timeout, () => {
// couldn't establish a connection because of timeout
socket.destroy()
return cb(null, null)
})
socket.connect(port, host, () => {
// connection established
return cb(null, port)
})
socket.on('error', (err) => {
// couldn't establish a connection
return cb(null, null)
})
}
const funcs = []
for (let port = 0; port <= 80; port++) {
funcs.push(function(callback) {
findPortStatus('192.30.253.112', port, 4000, (err, port) => {
if (!err) {
return callback(null, port)
}
})
})
}
async.parallel(funcs, (err, ports) => {
if (err) {
console.error(err.message)
} else {
for (let port of ports) {
if (port) {
console.log(port)
}
}
}
})
答案 0 :(得分:0)
不确定这是否相关,但是当你调用它时,你真的应该将某些传递给回调。 null,null
对调试不是很有用。我建议你的上下文中的timeout
事件可能不是错误,但它们是提供信息的。您可以cb(null, 'timeout')
或cb(null, {state: 'timedOut', port: port})
或其他什么来更好地跟踪哪些有效,哪些无效。
但是,实际错误的最可能的候选者是,如果您的套接字在connect事件成功后发出错误或超时事件。连接丢失等。如果您正在寻找的是一个类似“ping”的功能(显然不仅仅是ICMP),那么您应该在获得连接后立即关闭连接和/或删除其他事件侦听器作为连接监听器的处理程序。
最后,节点文档建议您不要直接调用socket.connect()
,除非实现自定义套接字(它看起来不像你),而是使用net.createConnection()
代替;不确定这对你有帮助,但值得注意。
答案 1 :(得分:0)
看起来成功连接的套接字随后会超时(这是有道理的,因为你连接但后来对连接什么都不做,所以它超时了。)
如果在连接成功后断开连接,那么应该清除错误。