2009-11-27 71 views
0
import java.net.*; 

import java.io.IOException; 
import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 

public class PortScanner { 

    public static void main(String[] args) { 
    InetAddress ia=null; 
    String host=null; 
     try { 

     host=JOptionPane.showInputDialog("Enter the Host name to scan:\n example: example.com"); 
      if(host!=null){ 
      ia = InetAddress.getByName(host); 
     scan(ia); } 
    } 
     catch (UnknownHostException e) { 
     System.err.println(e); 
    } 
    System.out.println("Bye from NFS"); 
    //System.exit(0); 
} 

    public static void scan(final InetAddress remote) { 
    //variables for menu bar 

    int port=0; 
    String hostname = remote.getHostName(); 

     for (port = 70; port < 65536; port++) { 
      try { 
      Socket s = new Socket(remote,port); 
      System.out.println("Server is listening on port " + port+ " of " + hostname); 
      s.close(); 
      break; 
     } 
      catch (IOException ex) { 
      // The remote host is not listening on this port 
      System.out.println("Server is not listening on port " + port+ " of " + hostname); 
     } 
    }//for ends 
} 
} 

請幫幫我。我可以加快掃描端口過程嗎?

回答

3

我不確定這是否會加快速度,但是由於您製作的每個套接字都與下一個套接字無關,您是否嘗試製作更多線程,以便在舊套接字等待握手時創建新套接字完成。

+0

我的意思是這組代碼 爲(端口= 70;端口<65536;端口++){ 嘗試{ 插座S =新的Socket(遠程,端口); System.out.println(「服務器正在偵聽」+ hostname「的端口」+ port +「); s.close(); 休息; } 它可以更快處理?導致需要花費很多時間逐一掃描端口。 – Otip88

+0

處理時間不會增加太多,因爲網絡連接握手性能幾乎不受您的控制。只是試圖平行打開套接字而不是等待每個套接字完成,你可能會有更好的性能。 –

+0

好的...謝謝你的提示..歡呼隊友。 – Otip88

0

而不是使用線

Socket s = new Socket(remote,port); 

的你應該使用

Socket s = new Socket(); 
int timeout = 100; // milliseconds 
s.connect(new InetSocketAddress(remote, port), timeout); 

這樣你就不必等待默認的TCP超時一看就知道這個端口被防火牆阻止沒有任何迴應。

+0

一旦建立連接需要超過100毫秒,這將會失敗。 – Bombe

+1

是的,這就是主意。當然,你會調整這個值給給定的基礎設施。但是,如果您嘗試連接時沒有超時,那麼您將等待幾分鐘直至失敗(如果防火牆阻止此端口)。 – tangens