Как получить конфигурацию Ip из сетевого интерфейса - PullRequest
0 голосов
/ 29 сентября 2019

У меня есть Java-приложение, которое извлекает информацию из сетевого интерфейса, и я использую класс NetworkInterface, чтобы перебрать весь спектр интерфейсов, имеющихся у меня на компьютере. «Я установил virtualbox», и это создает много виртуальных интерфейсов. Но мне нужно получить информацию от моего беспроводного или сетевого интерфейса, так как это единственный вариант подключения к сети. Проблема в том, что я хочу иметь возможность перебирать все эти интерфейсы и получать только соответствующие. Какой подход вы, ребята, предлагаете? выполняя поиск в коллекции NetworkInteface в поисках eth0 или wlan1. Любые идеи приветствуются. Вот код, который имеет дело с сетевым интерфейсом в моем приложении.

//displaying all network interface 
Enumeration<NetworkInterface> nets = null;
try {
   nets = NetworkInterface.getNetworkInterfaces();
} catch (SocketException e3) {
    e3.printStackTrace();
}

for (NetworkInterface netint : Collections.list(nets)) {            
   displayInterfaceInformation(netint);
}

static void displayInterfaceInformation(NetworkInterface netint) throws SocketException { 
    Enumeration<InetAddress> inetAddresses = netint.getInetAddresses();
    System.out.printf(count + " Display name: %s\n", netint.getDisplayName());
    System.out.printf("Name: %s\n", netint.getName());
    for (InetAddress inetAddress : Collections.list(inetAddresses)) {           
        System.out.printf("InetAddress: %s\n", inetAddress);
    }
    System.out.println("\n");
}

1 Ответ

1 голос
/ 30 сентября 2019

Там может быть более простой способ, но если вы просто ищете интерфейс, который подключается к Интернету, есть простой прием, который вы можете использовать, который не включает чтение таблиц маршрутизации - просто создайте сокет, подключите егона адрес, который существует в Интернете, затем получите локальный адрес этого сокета. Лучше использовать UDP-сокет, поскольку его connect не выполняет никакого реального ввода-вывода:

DatagramSocket s = new DatagramSocket();
s.connect(InetAddress.getByName("1.1.1.1"), 53);
System.out.println(s.getLocalAddress());

Операционная система свяжет сокет с соответствующим интерфейсом для исходящего соединения с помощью таблицы маршрутизации. Если у вас есть IP-адрес, вы можете найти интерфейс с этим IP-адресом.

...