2011-05-03 146 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