在Java中,如何实现UDP端口扫描?

时间:2011-05-03 10:51:22

标签: java networking udp

在这里新建,我正在开发端口扫描程序,TCP运行良好,但我不知道如何对UDP端口进行扫描。假设我想知道此LAN中另一台主机上的UDP端口XXXX是否已打开。这段代码会完成这项工作吗?如果没有,问题是什么?

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";
}
只是一个新手,还在学习。 谢谢!

2 个答案:

答案 0 :(得分:8)

UDP是无连接的,因此您无法期望响应数据包。如果端口关闭,您可能会收到ICMP错误消息,但不能保证这一点(例如防火墙可以静默丢弃数据包)。

答案 1 :(得分:3)

UDP Port Scanning is possible,但它比TCP扫描更难。

我在python中使用的一种方法是慢慢扫描三个或四个高编号UDP端口上的主机,并检查来自该主机的ICMP Port Unreachable消息。如果你得到任何一个,你知道路径上允许ICMP消息,所以你可以可靠地推断缺少响应是一个开放的端口。如果所有这些高编号端口都出现故障,您必须采用应用感知技术来保证成功。请注意,这应该缓慢完成(可能每隔一秒左右),以降低主机级ICMP速率限制的可能性。