2011-05-03 64 views
5

這裏新建一個端口掃描程序,TCP工作正常,但是我不知道如何去掃描UDP端口。說我想知道在這個局域網中的另一臺主機上的UDP端口XXXX是否打開。這段代碼是否會完成這項工作?如果沒有,問題是什麼?,如何實現UDP端口掃描?

protected String scanUDP(InetAddress IP, int port) 
{ 
    try{ 
     byte [] bytes = new byte[128]; 
     DatagramSocket ds = new DatagramSocket(); 
     DatagramPacket dp = new DatagramPacket(bytes, bytes.length, IP, port); 
     ds.setSoTimeout(1000); 
     ds.send(dp); 
     dp = new DatagramPacket(bytes, bytes.length); 
     ds.receive(dp); 
     ds.close(); 
    } 
    catch(InterruptedIOException e){ 
     return "CLOSED"; 
    } 
    catch(IOException e){ 
     return "CLOSED"; 
    } 
    return "OPEN"; 
} 

只是一個新手,還在學習。 謝謝!

回答

8

UDP是無連接的,所以你不能指望一個響應數據包,必然。如果端口已關閉,您可能會收到ICMP錯誤消息,但不能保證(例如,防火牆可能會悄悄丟棄數據包)。

+0

謝謝,但我該如何捕獲ICMP錯誤信息? – ralphxiaoz 2011-05-04 09:00:09

+4

DatagramSocket#發送將拋出一個你可以捕獲的PortUnreachableException。 – artbristol 2011-05-04 09:03:18

+0

謝謝!真的幫助 – ralphxiaoz 2011-05-06 00:08:38

3

UDP Port Scanning is possible,但它比TCP掃描更難。

我在python中使用的一種方法是慢慢掃描三個或四個高編號UDP端口上的主機,並檢查該主機發出的ICMP端口無法訪問消息。如果你得到其中的任何一個,你就知道ICMP消息被允許在路徑上,所以你可以可靠地推斷出沒有響應是一個開放的端口。如果所有這些高編號的端口都出現故障,您必須訴諸應用感知技術來保證成功。請注意,這應該慢慢地進行(可能每秒約一次)以降低主機級ICMP速率限制的可能性。

+0

謝謝,我知道這會做,但我不知道如何在Java中實現它,有什麼想法? – ralphxiaoz 2011-05-04 09:02:41