Получить локальный IP-адрес без подключения к Интернету

Итак, я пытаюсь получить IP-адрес моей машины в моей локальной сети (который должен быть 192.168.178.41 ).

Моим первым намерением было использовать что-то вроде этого:

InetAddress.getLocalHost().getHostAddress();

, но он возвращает только 127.0.0.1 , что правильно, но не очень полезно для меня.

Я поискал и нашел этот ответ https://stackoverflow.com/a/2381398/717341 , который просто создает Socket -соединение к некоторой веб-странице (например, "google.com") и получает адрес локального хоста из сокета:

Socket s = new Socket("google.com", 80);
System.out.println(s.getLocalAddress().getHostAddress());
s.close();

Это работает на моем компьютере (возвращает 192.168.178.41 ), но ему необходимо подключиться к Интернету, чтобы Работа. Поскольку моему приложению не требуется подключение к Интернету, и то, что приложение пытается подключиться к Google каждый раз при запуске, может показаться "подозрительным", мне не нравится идея его использования.

Итак, после некоторого дополнительного исследования я наткнулся на класс NetworkInterface , который (после некоторой работы) также возвращает желаемый IP-адрес:

Enumeration interfaces = NetworkInterface.getNetworkInterfaces();
while (interfaces.hasMoreElements()){
    NetworkInterface current = interfaces.nextElement();
    System.out.println(current);
    if (!current.isUp() || current.isLoopback() || current.isVirtual()) continue;
    Enumeration addresses = current.getInetAddresses();
    while (addresses.hasMoreElements()){
        InetAddress current_addr = addresses.nextElement();
        if (current_addr.isLoopbackAddress()) continue;
        System.out.println(current_addr.getHostAddress());
    }
}

На моей машине это возвращает следующее:

name:eth1 (eth1)
fe80:0:0:0:226:4aff:fe0d:592e%3
192.168.178.41
name:lo (lo)

Он находит оба моих сетевых интерфейса и возвращает желаемый IP-адрес, но я не уверен, какой другой адрес ( fe80: 0: 0: 0: 226: 4aff: fe0d: 592e% 3 ) средства.

Кроме того, я не нашел способа отфильтровать его из возвращенных адресов (с помощью методов isXX () объекта InetAddress ), кроме использования RegEx , который я считаю очень "грязным".

Есть другие мысли, кроме использования RegEx или Интернета?

34
задан Community 23 May 2017 в 12:02
поделиться