如何使用java获取本地系统的子网掩码?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/1221517/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to get subnet mask of local system using java?
提问by user149621
How do you get the Subnet
mask address of the local system using Java?
Subnet
使用Java如何获取本地系统的掩码地址?
回答by mas
java.net.InterfaceAddress in SE6 has a getNetworkPrefixLength method that returns, as the name suggests, the network prefix length. You can calculate the subnet mask from this if you would rather have it in that format. java.net.InterfaceAddresssupports both IPv4 and IPv6.
SE6 中的 java.net.InterfaceAddress 有一个 getNetworkPrefixLength 方法,顾名思义,该方法返回网络前缀长度。如果您希望采用该格式,则可以从中计算子网掩码。java.net.InterfaceAddress支持 IPv4 和 IPv6。
getSubnetMask() in several network application APIs returns subnet mask in java.net.InetAddress form for specified IP address (a local system may have many local IP addresses)
多个网络应用程序 API 中的 getSubnetMask() 以 java.net.InetAddress 形式返回指定 IP 地址的子网掩码(本地系统可能有许多本地 IP 地址)
回答by dfa
the netmask of the first address of the localhost interface:
本地主机接口的第一个地址的网络掩码:
InetAddress localHost = Inet4Address.getLocalHost();
NetworkInterface networkInterface = NetworkInterface.getByInetAddress(localHost);
networkInterface.getInterfaceAddresses().get(0).getNetworkPrefixLength();
a more complete approach:
更完整的方法:
InetAddress localHost = Inet4Address.getLocalHost();
NetworkInterface networkInterface = NetworkInterface.getByInetAddress(localHost);
for (InterfaceAddress address : networkInterface.getInterfaceAddresses()) {
System.out.println(address.getNetworkPrefixLength());
}
/24 means 255.255.255.
/24 表示 255.255.255。
回答by dfa
FWIW, in the past I'd tried using InterfaceAddress.getNetworkPrefixLength() and InterfaceAddress.getBroadcast(), but they don't return accurate info (this is on Windows, with Sun JDK 1.6.0 update 10). The network prefix length is 128 (not 24, which it is on my network), and the broadcast address returned is 255.255.255.255 (not 192.168.1.255, which it is on my network).
FWIW,过去我曾尝试使用 InterfaceAddress.getNetworkPrefixLength() 和 InterfaceAddress.getBroadcast(),但它们没有返回准确的信息(这是在 Windows 上,使用 Sun JDK 1.6.0 更新 10)。网络前缀长度是 128(不是 24,它在我的网络上),返回的广播地址是 255.255.255.255(不是 192.168.1.255,它在我的网络上)。
James
詹姆士
Update: I just found the solution posted here:
更新:我刚刚找到了这里发布的解决方案:
http://forums.sun.com/thread.jspa?threadID=5277744
You need to prevent Java from using IPv6, so that it isn't getting to IPv4 via IPv6. Adding -Djava.net.preferIPv4Stack=true to the command line fixes the results from InterfaceAddress.getNetworkPrefixLength() and InterfaceAddress.getBroadcast() for me.
您需要阻止 Java 使用 IPv6,这样它就不会通过 IPv6 访问 IPv4。将 -Djava.net.preferIPv4Stack=true 添加到命令行修复了 InterfaceAddress.getNetworkPrefixLength() 和 InterfaceAddress.getBroadcast() 的结果。
回答by FofBorg
I devised an IPv4 only solution that is simple enough. I needed that to generate netmask for subnetworks here in order to delegate those subnets correctly. I know I could have generated a table of the 32 possible masks, but I prefered to get it computed each time.
我设计了一个足够简单的纯 IPv4 解决方案。我需要在此处为子网生成网络掩码,以便正确委派这些子网。我知道我可以生成一个包含 32 个可能掩码的表格,但我更喜欢每次都计算它。
So here is my solution.
所以这是我的解决方案。
/*
* 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;
}
You just call it with the IP and the prefix you want to use, it will generate the netmask for you.
您只需使用 IP 和要使用的前缀调用它,它就会为您生成网络掩码。
回答by tak
I just finished working on an API for subnetting networks with Java.
我刚刚完成了使用 Java 对网络进行子网划分的 API 的工作。
https://launchpad.net/subnettingapi
https://launchpad.net/subnettingapi
it has that functionality and more.
它具有该功能以及更多功能。
回答by Mr.Dohai
I found that:
我找到:
NetworkInterface networkInterface = NetworkInterface.getByInetAddress(localHost);
To get subnetmask for ipv6 we can use:
要获取 ipv6 的子网掩码,我们可以使用:
networkInterface.getInterfaceAddresses().get(0).getNetworkPrefixLength();
To get subnetmask for ipv4 we can use:
要获取 ipv4 的子网掩码,我们可以使用:
networkInterface.getInterfaceAddresses().get(1).getNetworkPrefixLength();
回答by infografnet
Here is an answer, how to get a submask from WIFI connection: link
这是一个答案,如何从 WIFI 连接中获取子掩码:链接
I adapted it for my needs, and here it is:
我根据自己的需要调整了它,这里是:
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;
}
回答by Preetam Kumar
String local=InetAddress.getLocalHost().getHostAddress();
String[] ip_component = local.split("\.");
String subnet=ip_component[0]+"."+ip_component[1]+"."+ip_component[2]+".";
This worked for me. here the variable subnet has the subnet adress.
这对我有用。这里变量子网有子网地址。
回答by Interkot
You can convert the obtained value into the standard textual format like this:
您可以将获得的值转换为标准文本格式,如下所示:
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;
回答by Israel Jimenez
In summary, a method to obtain the mask would be like this:
总之,获取掩码的方法如下:
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;
}