【问题标题】:How to get subnet mask of local system using java?如何使用java获取本地系统的子网掩码?
【发布时间】:2010-11-16 07:55:45
【问题描述】:

如何使用Java获取本地系统的Subnet掩码地址?

【问题讨论】:

    标签: java networking


    【解决方案1】:

    localhost接口首地址的网络掩码:

    InetAddress localHost = Inet4Address.getLocalHost();
    NetworkInterface networkInterface = NetworkInterface.getByInetAddress(localHost);
    networkInterface.getInterfaceAddresses().get(0).getNetworkPrefixLength();
    

    更完整的方法:

    InetAddress localHost = Inet4Address.getLocalHost();
    NetworkInterface networkInterface = NetworkInterface.getByInetAddress(localHost);
    
    for (InterfaceAddress address : networkInterface.getInterfaceAddresses()) {
        System.out.println(address.getNetworkPrefixLength());
    }
    

    /24 表示 255.255.255。

    【讨论】:

    • 典型的 IPv4 值为 8 (255.0.0.0)、16 (255.255.0.0) 或 24 (255.255.255.0)。
    【解决方案2】:

    SE6 中的 java.net.InterfaceAddress 有一个 getNetworkPrefixLength 方法,顾名思义,该方法返回网络前缀长度。如果您希望采用该格式,则可以从中计算子网掩码。 java.net.InterfaceAddress 同时支持 IPv4 和 IPv6。

    多个网络应用程序 API 中的 getSubnetMask() 以 java.net.InetAddress 形式返回指定 IP 地址的子网掩码(本地系统可能有许多本地 IP 地址)

    【讨论】:

    • 你知道在Android中从以太网获取DNS和默认网关吗?
    【解决方案3】:

    我发现:

    NetworkInterface networkInterface = NetworkInterface.getByInetAddress(localHost);
    

    要获取 ipv6 的子网掩码,我们可以使用:

     networkInterface.getInterfaceAddresses().get(0).getNetworkPrefixLength(); 
    

    要获取 ipv4 的子网掩码,我们可以使用:

    networkInterface.getInterfaceAddresses().get(1).getNetworkPrefixLength();
    

    【讨论】:

      【解决方案4】:

      您可以将获得的值转换为标准的文本格式,如下所示:

      short prflen=...getNetworkPrefixLength();
      int shft = 0xffffffff<<(32-prflen);
      int oct1 = ((byte) ((shft&0xff000000)>>24)) & 0xff;
      int oct2 = ((byte) ((shft&0x00ff0000)>>16)) & 0xff;
      int oct3 = ((byte) ((shft&0x0000ff00)>>8)) & 0xff;
      int oct4 = ((byte) (shft&0x000000ff)) & 0xff;
      String submask = oct1+"."+oct2+"."+oct3+"."+oct4;
      

      【讨论】:

        【解决方案5】:

        我设计了一个非常简单的纯 IPv4 解决方案。我需要它在这里为子网生成网络掩码,以便正确委派这些子网。我知道我可以生成一个包含 32 个可能的掩码的表格,但我更喜欢每次都计算它。

        所以这是我的解决方案。

        /*
         * Get network mask for the IP address and network prefix specified...
         * The network mask will be returned has an IP, thus you can
         * print it out with .getHostAddress()...
         */
        public static InetAddress getIPv4LocalNetMask(InetAddress ip, int netPrefix) {
        
            try {
                // Since this is for IPv4, it's 32 bits, so set the sign value of
                // the int to "negative"...
                int shiftby = (1<<31);
                // For the number of bits of the prefix -1 (we already set the sign bit)
                for (int i=netPrefix-1; i>0; i--) {
                    // Shift the sign right... Java makes the sign bit sticky on a shift...
                    // So no need to "set it back up"...
                    shiftby = (shiftby >> 1);
                }
                // Transform the resulting value in xxx.xxx.xxx.xxx format, like if
                /// it was a standard address...
                String maskString = Integer.toString((shiftby >> 24) & 255) + "." + Integer.toString((shiftby >> 16) & 255) + "." + Integer.toString((shiftby >> 8) & 255) + "." + Integer.toString(shiftby & 255);
                // Return the address thus created...
                return InetAddress.getByName(maskString);
            }
                catch(Exception e){e.printStackTrace();
            }
            // Something went wrong here...
            return null;
        }
        

        您只需使用 IP 和要使用的前缀调用它,它就会为您生成网络掩码。

        【讨论】:

          【解决方案6】:

          我刚刚完成了使用 Java 对网络进行子网划分的 API。

          https://launchpad.net/subnettingapi

          它具有该功能等等。

          【讨论】:

            【解决方案7】:

            这是一个答案,如何从 WIFI 连接中获取子掩码:link

            我根据自己的需要对其进行了调整,这里是:

            private static String intToIP(int ipAddress) {
                String ret = String.format("%d.%d.%d.%d", (ipAddress & 0xff),
                        (ipAddress >> 8 & 0xff), (ipAddress >> 16 & 0xff),
                        (ipAddress >> 24 & 0xff));
            
                return ret;
            }
            
            public static String GetSubnetMask_WIFI() {
            
                WifiManager wifiManager = (WifiManager) Global.getMainActivity()
                        .getSystemService(Context.WIFI_SERVICE);
                WifiInfo wifiInfo = wifiManager.getConnectionInfo();
            
                DhcpInfo dhcp = wifiManager.getDhcpInfo();
                String mask = intToIP(dhcp.netmask);
            
                return mask;
            }
            

            【讨论】:

            • 这是android特有的,问题没有说明。
            【解决方案8】:

            总的来说,获取掩码的方法是这样的:

            public String mascara() throws SocketException{
                try{
                    InetAddress localHost = Inet4Address.getLocalHost();
                    NetworkInterface networkInterface = NetworkInterface.getByInetAddress(localHost);
                    prefijo = 
                        ""+networkInterface.getInterfaceAddresses().get(0).getNetworkPrefixLength();
                    int shft = 0xffffffff<<(32- 
                            networkInterface.getInterfaceAddresses().get(0).getNetworkPrefixLength());
                    int oct1 = ((byte) ((shft&0xff000000)>>24)) & 0xff;
                    int oct2 = ((byte) ((shft&0x00ff0000)>>16)) & 0xff;
                    int oct3 = ((byte) ((shft&0x0000ff00)>>8)) & 0xff;
                    int oct4 = ((byte) (shft&0x000000ff)) & 0xff;
                    mascara = oct1+"."+oct2+"."+oct3+"."+oct4;
                    // System.out.println(""+mascara);           
                }catch(UnknownHostException e){
                    System.out.println("Error: "+e);
                }
                return mascara;
            }
            

            【讨论】:

            【解决方案9】:

            FWIW,过去我曾尝试使用 InterfaceAddress.getNetworkPrefixLength() 和 InterfaceAddress.getBroadcast(),但它们没有返回准确的信息(这是在 Windows 上,使用 Sun JDK 1.6.0 update 10)。网络前缀长度为 128(不是 24,它在我的网络上),返回的广播地址是 255.255.255.255(不是 192.168.1.255,它在我的网络上)。

            詹姆斯

            更新:我刚刚找到了这里发布的解决方案:

                 http://forums.sun.com/thread.jspa?threadID=5277744
            

            您需要阻止 Java 使用 IPv6,以免它通过 IPv6 访问 IPv4。 在命令行中添加 -Djava.net.preferIPv4Stack=true 可以修复 InterfaceAddress.getNetworkPrefixLength() 和 InterfaceAddress.getBroadcast() 的结果。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2012-12-03
              • 2015-07-02
              • 2014-08-24
              • 2019-08-12
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多