2016-07-18 1 views
0

私はこのポートスキャナを書いていますが、正確な結果が得られていません。ここでは、このスキャナ異なるランニングでノードに書き込まれたこのポートスキャナが正確な結果を出さないのはなぜですか?

  • についての私の観測は、それはあなたに別の解像度を与える可能性があり、ある
  • 私はポートの範囲を縮小する上での結果が良くなることに気づいた
  • ここ

は、コードは次のとおりです。

const net = require('net') 
 

 
function findPortStatus(port, host, timeout) { 
 
    return new Promise((resolve, reject) => { 
 
    const socket = net.createConnection(port, host,() => { 
 
     resolve(port) 
 
     socket.destroy() 
 
    }) 
 

 
    socket.setTimeout(timeout,() => { 
 
     resolve('timeout') 
 
     socket.destroy() 
 
    }) 
 

 
    socket.on('error', (err) => { 
 
     resolve('error') 
 
    }) 
 
    }) 
 
} 
 

 

 
const promises = [] 
 

 
for (let port = 1; port <= 65535; port++) { 
 
    promises.push(findPortStatus(port, process.argv[2], 10000)) 
 
} 
 

 
Promise.all(promises) 
 
    .then(ports => { 
 
    for (let port of ports) { 
 
     if (typeof(port) === 'number') { 
 
     console.log(port) 
 
     } 
 
    } 
 
    })

コードから手動で範囲を変更し、コードを複数回実行してみてください。同時に開い64kのソケット、64kのファイルディスクリプタなど

ように私はあなたがエラーの種類を確認するべきだと思う...あなたは多くのリソースが必要になります、このコードを実行するには、あなたに

答えて

0

ありがとうございました限られたファイル記述子が原因かもしれません。

Promise.allの代わりにasync.queueを使用して負荷を分散する必要があります(例:200個のポートを一度にテストし、それ以上ではありません)...この使用例には理想的ではありません。再作成されました。 Promise.allは完了するまで待つだけで、実際に作業を開始することはありません。

遅延は増加しますが、リソース使用率はより管理しやすくなります。一度にすべての64kポートをヒットしようとすると、多くの負荷が発生します...

関連する問題