Как вы получаете адрес маски Subnet
локальной системы, использующей Java?
Как получить маску подсети локальной системы с помощью java?
Ответ 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.
Ответ 2
java.net.InterfaceAddress в SE6 имеет метод getNetworkPrefixLength, который возвращает, как следует из названия, длину префикса сети. Вы можете рассчитать маску подсети, если вы предпочитаете ее в этом формате. java.net.InterfaceAddress поддерживает как IPv4, так и IPv6.
getSubnetMask() в нескольких API сетевых приложений возвращает маску подсети в форме java.net.InetAddress для указанного IP-адреса (локальная система может иметь много локальных IP-адресов)
Ответ 3
Я обнаружил, что:
NetworkInterface networkInterface = NetworkInterface.getByInetAddress(localHost);
Чтобы получить маску подсети для ipv6, мы можем использовать:
networkInterface.getInterfaceAddresses().get(0).getNetworkPrefixLength();
Чтобы получить маску подсети для ipv4, мы можем использовать:
networkInterface.getInterfaceAddresses().get(1).getNetworkPrefixLength();
Ответ 4
Я разработал только 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 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-адресом и префиксом, который хотите использовать, он будет генерировать сетевую маску для вас.
Ответ 5
Я только что закончил работу над API для сетей подсети с Java.
https://launchpad.net/subnettingapi
у него есть эта функциональность и многое другое.
Ответ 6
Вот ответ, как получить подмаск из 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;
}
Ответ 7
Таким образом, метод для получения маски будет выглядеть следующим образом:
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;
}
Ответ 8
FWIW, в прошлом я пытался использовать InterfaceAddress.getNetworkPrefixLength() и InterfaceAddress.getBroadcast(), но они не возвращают точную информацию (это в Windows с обновлением Sun JDK 1.6.0 10). Длина префикса сети составляет 128 (не 24, что находится в моей сети), а широковещательный адрес - 255.255.255.255 (не 192.168.1.255, который находится в моей сети).
Джеймс
Обновление: я нашел решение, размещенное здесь:
http://forums.sun.com/thread.jspa?threadID=5277744
Вам нужно запретить Java использовать IPv6, чтобы он не попадал на IPv4 через IPv6. Добавление -Djava.net.preferIPv4Stack = true в командной строке фиксирует результаты из интерфейсаAdapterAddress.getNetworkPrefixLength() и InterfaceAddress.getBroadcast() для меня.
Ответ 9
Вы можете преобразовать полученное значение в стандартный текстовый формат следующим образом:
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;
Ответ 10
String local=InetAddress.getLocalHost().getHostAddress();
String[] ip_component = local.split("\\.");
String subnet=ip_component[0]+"."+ip_component[1]+"."+ip_component[2]+".";
Это сработало для меня. здесь переменная подсеть имеет адрес подсети.