Как получить маску подсети локальной системы с помощью java?

Как получить адрес маски Subnet локальной системы с использованием Java-программирования?

сетевая маска первого адреса интерфейса 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; 
  • UnionFS одинаково в окнах, фактически объединять папки
  • Настроить карту сетевого диска на Mac OS X Leopard
  • Записи NDP в Linux
  • Лучшая сетевая библиотека C / C ++
  • Как сделать мой постоянный шлюз постоянным в CentOS? Чтобы после перезагрузки он не потерялся
  • Доступ к Mac через имя хоста.local с ПК с ОС Windows
  • Каковы различные способы удаленного подключения к вашему компьютеру?
  • Как настроить параметры DNS с помощью командной строки или PS?
  • Преобразование с плавающей запятой 32-бит в 16 бит
  • Быстрая загрузка HTTP
  • Почему rsync через SSH дает мне 10-кратную пропускную способность SCP?
  • Interesting Posts

    Преобразование даты времени в эпоху в Bash

    Android: привязка данных из базы данных к CheckBox в ListView?

    Поддерживает ли Java внутренние / локальные / вспомогательные методы?

    Java: функция переопределения для отключения проверки сертификата SSL

    Android: загружено изображение Picasso. как показать сообщение об ошибке

    Как получить (gci) .count, чтобы возвращать правильные числовые значения для пустых или одиночных списков?

    Цвет текста пункта меню «Действие»

    Page_ClientValidate () с несколькими ValidationGroups – как показать несколько сводок одновременно?

    Чтение нескольких (excel) файлов в R – Лучшая практика

    Есть ли способ использовать две тени CSS3 для одного элемента?

    Регистрация в Facebook иногда не предоставляет адрес электронной почты

    Получить SSID при подключении WIFI

    Сканер только считывает имя файла и ничего больше

    Как выполнять команды через дочерний процесс NodeJS?

    Фоновое изображение в ключевом кадре не отображается в Firefox или Internet Explorer

    Давайте будем гением компьютера.