【问题标题】:JAVA: scan specific network for host nameJAVA:扫描特定网络以获取主机名
【发布时间】:2019-05-18 17:06:53
【问题描述】:

我已经had problems 找到了一个具有专用主机专用网络的本地 VM,并试图像这样获取它:

private static void printUvms(String domainName, String pattern)
{
    InetAddress[] addresses = null;
    try
    {
        addresses = InetAddress.getAllByName(domainName);
    }
    catch (UnknownHostException e)
    {
        System.out.println("Unknown Host: " + domainName);
        return;
    }

    for (InetAddress address : addresses)
    {
        System.out.println("Host Name: " + address.getHostName());
        System.out.println("Host Address: " + address.getHostAddress());
        if (address.getHostAddress().startsWith(pattern))
        {
            System.out.println("UVM found!");
        }
    }
}

在这里,domainName 是 VM 的名称(“UVM”),pattern 是“192.168”。因为它是一个仅限主机的网络。

由于某种原因,当我在 Windows 控制台中运行“arp -a”时,即使 VM 具有正确的名称并列出了 192.168.[i].[j] 地址,它有时也找不到此 VM ,但有时确实如此。 如果没有,它会在某个连接到网络的某个地方找到具有相同名称的不同虚拟机,如果找到,它只会找到本地虚拟机。然而,从来没有两者,考虑到我尝试“getAllByName”,我觉得很困惑。

所以我尝试了一种不同的方法,如下所示:

private static String getUvm(String domainName, String pattern)
{
    String host = null;

    for (int i = 0; i < 256; i++)
    {
        System.out.println(String.format("Checking %s%d...", pattern, i));
        for (int j = 0; j < 256; j++)
        {
            host = String.format("%s%d.%d", pattern, i, j);
            InetAddress address = null;
            try
            {
                address = InetAddress.getByName(host);
                if (address.getHostName().equals(domainName))
                {
                    System.out.println("Host Name: " + address.getHostName());
                    System.out.println("Host Address: " + address.getHostAddress());
                    System.out.println("UVM found!");
                    return host;
                }
            }
            catch (UnknownHostException e)
            {
                System.out.println("Unknown Host: " + domainName);
                return null;
            }
        }
    }
    return null;
}

显然,这是一种非常耗时的方法,我最终无法使用。 如果有人能告诉我如何以更好、更有效的方式做到这一点,我将不胜感激。 :)

【问题讨论】:

    标签: java networking virtual-machine ip-address


    【解决方案1】:

    我刚刚看了Java doc,有一个方法:

    静态 InetAddress[] getAllByName(String host)

    及解释:

    给定主机的名称,根据系统上配置的名称服务返回其 IP 地址的数组。

    所以你可以这样做,这里有简单的代码:

    List<> list = ..;
    InetAddress[] inetAddress = InetAddress[] getAllByName(your domainName){}
    for(InetAddress : inetAddress) {
        list.add(inetAddress.getHostAddress().startWith("192.168"));
    }
    

    【讨论】:

    • 这就是我尝试使用的第一种方法,但它并没有返回给我指定名称的所有主机。我可以找到 2 个虚拟机,都称为“UVM”。地址以 192.168 开头的本地地址。 (我想找到的那个),以及网络中某处的第二个(不以 192.168 开头。)。我打印了由 InetAddress.getAllByName 返回的具有指定名称的所有 VM,但是我总是只找到其中​​一个。即使我在命令行中执行windows“arp -a”命令时列出了两者的地址。
    • 我查了源码,发现这个方法是getAllByName,如果你放一个主机名参数,它会执行getAllByName0方法在 InetAddress.class 中私有和静态。在这个方法中,首先它会执行 getCachedAddresses 方法然后继续。显然,它看起来像缓存,你输入的主机名是关键。你只能找到一个,也许是密钥对结构。
    • 还有一些值得注意的事情:/* 如果它到达这里,则假定它是一个主机名 / / Cache.get 可以返回:null、unknownAddress 或 InetAddress[ ] / / 确保允许连接到主机,然后我们 * 给出主机名 */
    • 这些是一些有趣的见解。我会进一步研究,非常感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 2019-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多