2012-06-27 4 views
2

어떤 포트가 사용 중인지 탐지하기 위해 포트 스캐너를 설계 중입니다. 문제는 일부 포트가 사용 중이라는 것을 알고 있더라도 사용하지 않는 포트를 모두 표시한다는 것입니다. 문제를 파악하는 데 도움이 필요합니다. 여기 내 코드가있다.Java에서 socket api 관련 문제


package portscanner; 

import java.net.Socket; 
import java.util.Scanner; 

/** 
* 
* @author DeLL 
*/ 
public class Main { 

/** 
* @param args the command line arguments 
*/ 
public static void main(String[] args) { 
    System.out.println("Enter the range of ports to be scanned:"); 
    Scanner ob=new Scanner(System.in); 
    int start=ob.nextInt(); 
    int stop=ob.nextInt(); 
    if(start<0||stop<0||start>65535||stop>65535){ 
     System.out.println("Invalid Range!!!"); 
    } 
    for(int i=start;i<=stop;i++){ 
     try{ 
      Socket sock = new Socket("127.0.0.1",i); 
      System.out.println("Port in use :"+i); 
      sock.close(); 
     } 
     catch(Exception e){ 
      System.out.println("Port not in use: "+i); 
     } 
    } 
} 

} 

+0

흠. 나를 위해 일합니다. 그것은 나에게 22 (ssh), 1090을 알려주고 다른 몇개는 사용 중이다. – Bombe

+1

테스트 중에 방화벽이 활성화되어 있습니까? 방화벽은 일반적으로 자바 시작 프로그램 (예 : 'java.exe')에 대한 규칙을 만듭니다. 그것은 모든 자바 프로그램에 공통적이며 어떤 이유로 더 일찍 블랙리스트에 올 수도 있습니다. – Mersenne

답변

2

이 상대 : http://docs.oracle.com/javase/6/docs/api/java/net/Socket.html#Socket%28java.lang.String,%20int%29

소켓 생성자는 세 가지 예외가 발생합니다 :
UnknownHostException의를 - 호스트의 IP 주소를 판정 할 수없는 경우.
IOException - 소켓을 작성할 때 입출력 오류가 발생하는 경우.
SecurityException - 시큐러티 매니저가 존재 해, 그 checkConnect 메소드가 조작을 허가하지 않는 경우.

포트가 이미 사용 중이면 아무 것도 throw되지 않습니다. 소켓이 alredy에 바인드되고있는 경우는 IOException를 슬로우하는 bind() 메소드를 사용할 수 있습니다.

+0

OP 코드가 로컬 컴퓨터와 원격 컴퓨터 모두에 사용된다고 가정하면 호스트에 연결할 때 서비스가 연결을 수신하지 않을 때 IOException이 발생해야합니다. 포트에서 수신 대기중인 서비스가 없으면 포트가 사용 중이 지 않습니다. 로컬 머신을 스캔하기 위해서 bind()가 좋은 테스트가 될 것이다. 나는 OP의 문제가 방화벽 문제라고 내기를 기꺼이하겠다. –

0

당신은 예외 처리에 너무 무차별입니다. ConnectException 만 포트가 사용 중이 아님을 알립니다. 다른 모든 예외는 다른 문제점을 나타냅니다. CatchException을 잡아서 처리하십시오.