В Java я хотел бы найти java.net.NetworkInterface, соответствующий используемому интерфейсу, для доступа к шлюзу по умолчанию. Названия интерфейсов и т.п. заранее не известны.
Другими словами -, если бы следующая таблица маршрутизации была моей, я бы хотел, чтобы интерфейс соответствовал «bond0»:
$ netstat -r
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
10.10.10.0 * 255.255.255.0 U 0 0 0 bond0
10.10.11.0 * 255.255.255.0 U 0 0 0 eth2
10.10.11.0 * 255.255.255.0 U 0 0 0 eth3
10.10.12.0 * 255.255.255.0 U 0 0 0 eth4
10.10.13.0 * 255.255.255.0 U 0 0 0 eth5
default mygateway 0.0.0.0 UG 0 0 0 bond0
После некоторого поиска в Google я до сих пор не нашел ответа.
редактировать:
Среда выполнения Java должна «знать», как получить эту информацию (, чтобы не сказать, что она открыта ). При присоединении java.net.MulticastSocket к группе многоадресной рассылки с использованием вызова join (InetAddress grpAddr )(, который не указывает интерфейс ), очевидное поведение, по-видимому, заключается в присоединении к «по умолчанию» интерфейс (как определено выше ). Это работает, даже если intf по умолчанию не является первым интерфейсом, указанным в таблице маршрутизации. Однако базовый вызов POSIX, который присоединяется к группе mcast, требует этой информации!:
struct ip_mreqn group;
group.imr_multiaddr =...
group.imr_address = **address of the interface!**
setsockopty(sd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &group, sizeof(group));
Точка:предоставляя метод для присоединения к группе многоадресной рассылки, который не требует intf, платформа java неявно должна знать, как определить соответствующий intf на каждой платформе.