如何枚举计算机所在子网的所有ip

时间:2012-12-14 14:39:38

标签: java network-programming

我是java的新手,正在使用Java做项目。

我有一个IP(例如192.168.0.10)和一个子网掩码(让我们说,255.255.255.0)。我需要这个子网中所有IP地址的列表。我能想到的最好的是天真的解决方案(我必须处理位和所有)。有没有人知道这样做的更好/更好的方式。

如果我们考虑这个例子,我们将把ip列表作为192.168.0.1. 192.168.0.2, 192.168.0.3, ..... , 192.168.0.254

任何帮助表示感谢。

[编辑]我想到了天真的方法:

通过考虑您拥有的IP地址和子网构造一个整数。在我们的例子中,它将以二进制表示形式11000000.10101000.00000000.00000000(为了可读性而添加点)。将此数字递增1,直到从左切换24位。它切换的第一个图块我们生成了所有可能在该子网中的ip的数字。现在的任务是从32位数生成ip,这可以通过写一个一次提取8位的函数来完成。

2 个答案:

答案 0 :(得分:3)

Apache Commons SubnetUtils

SubnetUtils utils = new SubnetUtils("192.168.0.10", "255.255.255.0");
String[] addresses = utils.getInfo().getAllAddresses();

getHighAddressgetLowAddress可能对您非常有用。在文档中查看更多详细信息。

答案 1 :(得分:1)

这个怎么样?

更新:小调整以防止枚举两个专用IP(网络IP和广播IP)。我认为这是没有额外依赖性的最简单的解决方案。

最终更新:我修改了Java对已签名部门进行四舍五入的规则。

public class ListIPs
{
    static int IPNum(int a, int b, int c, int d)
    {
        int ip = ((a * 256 | b) * 256 | c) * 256 | d;
        return ip;
    }

    static void ListIPs(int ip, int mask)
    {
        int index;
        int count = 1;
        int temp = mask;
        long a, b, c, d;

        while ((temp & 1) == 0)
        {
            count *= 2;
            temp >>= 1;
        }

        for (index = 1; index < count -1; index++)
        {
            long newIP = ((ip & mask) | index) & 0xFFFFFFFFL;


            d = newIP & 0xFF;
            c = (newIP / 256) & 0xFF;
            b = (newIP / 65536) & 0xFF;
            a = (newIP / 16777216) & 0xFF;

            System.out.println("" + a + "." + b + "." + c + "." + d);
        }
    }

    public static void main(String[] args)
    {
        ListIPs(IPNum(192, 168, 0, 10), IPNum(255, 255, 255, 0));
    }
}