JAVA:扫描特定网络以查找主机名

时间:2018-12-18 09:51:28

标签: java networking virtual-machine ip-address

我已经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”),模式将是“ 192.168。”因为它是仅主机的网络。

由于某些原因,即使在我在Windows控制台中运行“ arp -a”时,该虚拟机具有正确的名称并以192.168。[i]。[j]地址列出,它有时也找不到此虚拟机,但有时确实如此。 否则,它会在连接到网络的某个位置找到具有相同名称的其他VM,如果存在,则只能找到本地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;
}

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

1 个答案:

答案 0 :(得分:0)

我只是看过Java文档,有一种方法:

静态InetAddress [] getAllByName(字符串主机)

解释:

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

因此您可以执行以下操作,这是简单的代码:

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