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

6

你好,我正在开发一个端口扫描程序,TCP协议已经能够正常工作,但是我不知道如何实现UDP端口扫描。比如说,我想要知道在这个局域网中另一台主机上的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个回答

9

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


4
DatagramSocket#send 会抛出 PortUnreachableException 异常,你可以捕获它。 - artbristol

3

UDP端口扫描是可能的,但比TCP扫描更困难。

我在Python中使用的一种方法是在三到四个高编号的UDP端口上缓慢扫描主机,并检查来自该主机的ICMP端口不可达消息。如果您收到任何这些消息,则知道路径上允许ICMP消息,因此可以可靠地推断缺少响应是一个开放的端口。如果所有这些高编号端口都失败了,您必须采用应用程序感知技术来保证成功。请注意,这应该缓慢进行(大约每秒一次),以降低主机级别的ICMP速率限制的概率。


谢谢,我知道这个可以,但是我不知道如何在Java中实现它,有什么想法吗? - ralphxiaoz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接