2016-07-18 2 views
0

이 포트 스캐너를 작성했지만 정확하지 않습니다. 다음은이 스캐너 다른 달리기에노드에이 포트 스캐너가 정확한 결과를 제공하지 않는 이유는 무엇입니까?

  • 에 대한 나의 관찰이 당신에게 다른 입술을 줄 수 있습니다
  • I 포트의 범위를 축소에 결과를 더 얻을 것으로 나타났습니다
  • 여기

코드는 다음과 같습니다

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

코드에서 수동으로 범위를 변경하고 코드를 여러 번 실행 해보십시오. 당신이

답변

0

이 코드를 실행하려면 감사합니다, 당신은 등을 동시에 열 64K 소켓과 같은 많은 자원 ..., 64K 파일 설명,

난 당신이 오류의 종류를 확인해야한다고 생각을해야합니다 제한된 파일 기술자가 원인 일 수 있습니다.

Promise.all 대신에 예를 들어 async.queue을 사용하여 부하를 분산시켜야합니다 (예 : 200 개 포트를 한 번에 테스트하고 그 이상은 아닙니다) ... 약속은이 사용 케이스에 이상적이지 않습니다. 다시 만들어졌습니다. Promise.all은 완료 될 때까지 기다리지 만 실제로 작업을 시작하지는 않습니다.

대기 시간은 늘어나지 만 자원 사용은보다 관리하기 쉽습니다. 한 번에 모든 64k 포트를 사용하려고하면 많은로드가 발생합니다 ...

관련 문제