2016-07-18 8 views
0

Ich schreibe einen einfachen Port-Scanner mit Kern net Modul von Node.js. Ich bekomme einen 'Rückruf wurde bereits angerufen' Fehler mit meinem Code. Können Sie bitte erkennen, woher der Fehler kommt? Unten ist mein Code:Callback wurde bereits mit async.parallel Funktion aufgerufen

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) 
 
     } 
 
    } 
 
    } 
 
})

Antwort

0

nicht sicher, ob dies zusammenhängt, aber Sie wirklich etwas an die Rückruf passieren soll, wenn Sie es nennen. null,null ist nicht sehr nützlich für das Debuggen. Was ich vorschlagen würde ist timeout Ereignisse in Ihrem Kontext sind wahrscheinlich keine Fehler, aber sie sind informativ. Sie könnten einfach cb(null, 'timeout') oder cb(null, {state: 'timedOut', port: port}) oder etwas, um besser zu verfolgen, was funktioniert hat und was nicht.

Der wahrscheinlichste Kandidat für Ihren tatsächlichen Fehler ist jedoch, wenn Ihr Socket einen Fehler oder ein Timeout-Ereignis ausgibt, nachdem das Verbindungsereignis bereits erfolgreich war. Drop-Verbindung oder dergleichen. Wenn alles, was Sie suchen, eine "Ping" -ähnliche Funktionalität ist (mehr als nur ICMP natürlich), dann sollten Sie die Verbindung wahrscheinlich schließen, sobald Sie eine Verbindung herstellen und/oder die anderen Ereignis-Listener als Teil des entfernen Verbinden Sie den Handler des Hörers.

Schließlich schlagen die Node-Dokumente vor, dass Sie socket.connect() nicht direkt aufrufen, es sei denn, Sie implementieren einen benutzerdefinierten Socket (der nicht so aussieht), sondern stattdessen net.createConnection(); nicht sicher, dass dir das helfen wird, aber es ist es wert, es zu beachten.

0

Es sieht so aus, als ob die erfolgreich verbundenen Sockets im nachhinein getaktet werden (was sinnvoll ist, wenn Sie sich verbinden, dann aber nichts mit der Verbindung machen, also Timeout).

Wenn Sie die Verbindung zu einem Socket trennen, nachdem Sie eine erfolgreiche Verbindung aufgezeichnet haben, sollte der Fehler behoben sein.

Verwandte Themen