如何获得使用java的本地系统的子网掩码?

如何使用Java编程获得本地系统的Subnet地址?

localhost接口的第一个地址的networking掩码:

 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。

SE6中的java.net.InterfaceAddress有一个getNetworkPrefixLength方法,顾名思义,它返回networking前缀长度。 如果你想用这种格式,你可以从这里计算出子网掩码。 java.net.InterfaceAddress支持IPv4和IPv6。

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

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

https://launchpad.net/subnettingapi

它有这个function和更多。

我devise了一个简单的IPv4解决scheme。 我需要这个在这里为子网生成networking掩码,以便正确地委托这些子网。 我知道我可以生成一个32个可能的掩码表,但我最好每次计算它。

所以这是我的解决scheme。

 /* * 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和你要使用的前缀,它会为你生成networking掩码。

我find:

 NetworkInterface networkInterface = NetworkInterface.getByInetAddress(localHost); 

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

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

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

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

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

詹姆士

更新:我刚刚在这里发现了解决scheme:

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

您需要防止Java使用IPv6,以免它通过IPv6进入IPv4。 在命令行中添加-Djava.net.preferIPv4Stack = true为我修复了来自InterfaceAddress.getNetworkPrefixLength()和InterfaceAddress.getBroadcast()的结果。

这里是一个答案,如何从WIFI连接获得子掩码: 链接

我适应了我的需要,这里是:

 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; } 
 String local=InetAddress.getLocalHost().getHostAddress(); String[] ip_component = local.split("\\."); String subnet=ip_component[0]+"."+ip_component[1]+"."+ip_component[2]+"."; 

这对我有效。 这里的variables子网有子网地址。

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

 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;