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
классы, чтобы получить подробную информацию о вашей сети.