Как получить маску подсети локальной системы с помощью java?
Как получить адрес маски Subnet
локальной системы с использованием Java-программирования?
- Блокировать доступ к Центру обновления Windows
- Как переустановить драйвер протокола TCP / IP в Windows 7?
- Как назначить статический IP-адрес клиенту ICS?
- Переопределение DNS в режиме сверстников
- Vpn не удалось зарегистрировать ваш компьютер на сетевом этапе
- Узнайте, какие программы сильно используют сеть
- Как запросить текущий IP-адрес iPhone?
- Несколько шлюзов по умолчанию
сетевая маска первого адреса интерфейса 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.
java.net.InterfaceAddress в SE6 имеет метод getNetworkPrefixLength, который возвращает, как следует из названия, длину префикса сети. Вы можете рассчитать маску подсети, если вы предпочитаете ее в этом формате. java.net.InterfaceAddress поддерживает как IPv4, так и IPv6.
getSubnetMask () в нескольких API сетевых приложений возвращает маску подсети в форме java.net.InetAddress для указанного IP-адреса (локальная система может иметь много локальных IP-адресов)
Я нашел это:
NetworkInterface networkInterface = NetworkInterface.getByInetAddress(localHost);
Чтобы получить маску подсети для ipv6, мы можем использовать:
networkInterface.getInterfaceAddresses().get(0).getNetworkPrefixLength();
Чтобы получить маску подсети для ipv4, мы можем использовать:
networkInterface.getInterfaceAddresses().get(1).getNetworkPrefixLength();
Я разработал только 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-адресом и префиксом, который хотите использовать, он будет генерировать сетевую маску для вас.
Я только что закончил работу над API для сетей подсети с Java.
https://launchpad.net/subnettingapi
он имеет эту функциональность и многое другое.
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 () для меня.
Вот ответ, как получить подмаску из 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; }
String local=InetAddress.getLocalHost().getHostAddress(); String[] ip_component = local.split("\\."); String subnet=ip_component[0]+"."+ip_component[1]+"."+ip_component[2]+".";
Это сработало для меня. здесь переменная подсеть имеет адрес подсети.
Вы можете преобразовать полученное значение в стандартный текстовый формат следующим образом:
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;