Java, получение DatagramPacket, как определить локальный IP-интерфейс

вот простой случай при привязке ко всем IP-интерфейсам и определенному udp-порту:

int bindPort = 5555;  // example, udp port number
DatagramSocket socket = new DatagramSocket(bindPort);

byte[] receiveData = new byte[1500];
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);

...

socket.receive(receivePacket);

Как узнать, на каком IP-интерфейсе я получил пакет ?

Я вижу, что есть getSocketAddress():

получает SocketAddress (обычно IP-адрес + номер порта) удаленный хост, на который отправляется или с которого поступает этот пакет.

но это возвращает удаленный ip + порт. Я хотел бы знать локальный ip (локальный порт 5555 в этом примере).

возможно ли это с помощью std. Библиотеки Java ?

2 ответов


Я знаю эту проблему. Для уточнения цели этого: вы получаете пакет через UDP (обычно какая-то реализация обнаружения) и хотите вернуть anwer как ("Дорогой клиент, Пожалуйста, загрузите файл из http://<wtf-is-my-ip>:8080/thefile.txt"). Моя машина имеет три IP-адреса: 127.0.0.1, 192.168.X. x и 10.X. X. x и цель состоит в том, чтобы узнать, что удаленный клиент отправил пакет UDP в 192.168.X. x и что это должен быть IP, который также будет работать для другого соединения.

С weupnp проект Я нашел следующий код, который не идеален, но работал для меня:

    private InetAddress getOutboundAddress(SocketAddress remoteAddress) throws SocketException {
        DatagramSocket sock = new DatagramSocket();
        // connect is needed to bind the socket and retrieve the local address
        // later (it would return 0.0.0.0 otherwise)
        sock.connect(remoteAddress);

        final InetAddress localAddress = sock.getLocalAddress();

        sock.disconnect();
        sock.close();
        sock = null;

        return localAddress;
    }

//DatagramPacket receivePacket;
socket.receive(receivePacket);
System.out.print("Local IP of this packet was: " + getOutboundAddress(receivePacket.getSocketAddress()).getHostAddress);

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


Вы можете использовать комбинацию NetworkInterface и InetAddress классы, чтобы получить подробную информацию о вашей сети.

NetworkInterface

InetAddress