【问题标题】:in Java, how to achieve UDP port scanning?在Java中,如何实现UDP端口扫描?
【发布时间】:2011-05-03 10:51:22
【问题描述】:

这里是新的,我正在开发一个端口扫描程序,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";
}

只是一个新手,还在学习中。 谢谢!

【问题讨论】:

    标签: java networking udp


    【解决方案1】:

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

    【讨论】:

    • DatagramSocket#send 会抛出一个您可以捕获的 PortUnreachableException。
    【解决方案2】:

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

    我在 python 中使用的一种方法是在三个或四个高编号 UDP 端口上缓慢扫描主机,并检查来自该主机的 ICMP Port Unreachable 消息。如果您得到其中任何一个,您就知道路径上允许 ICMP 消息,因此您可以可靠地推断缺少响应是一个开放端口。如果所有这些高编号端口都失败了,您必须求助于应用程序感知技术来保证成功。请注意,这应该缓慢进行(可能每秒一次左右)以减少主机级 ICMP 速率限制的可能性。

    【讨论】:

    • 谢谢,我知道这可以,但我不知道如何在 Java 中实现它,有什么想法吗?
    猜你喜欢
    • 2017-12-10
    • 2013-12-17
    • 1970-01-01
    • 1970-01-01
    • 2011-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-30
    相关资源
    最近更新 更多