Я использую java.nio.channels.DatagramChannel для отправки и получения многоадресных сообщений UDP. Коробка, на которой работает моя программа, может иметь несколько сетевых интерфейсов.
Я могу указать сетевой интерфейс вручную, используя опцию сокета для исходящих дейтаграмм:
NetworkInterface ni = NetworkInterface.getByName("eth0");
channel.setOption(StandardSocketOptions.IP_MULTICAST_IF, ni);
и передача сетевого интерфейса в метод соединения для входящих дейтаграмм:
MembershipKey key = channel.join(group, ni);
Но я бы хотел, чтобы мое приложение использовало интерфейс по умолчанию на основе таблиц маршрутизации. Для исходящих данных это просто. Я не должен указывать IP_MULTICAST_IF или передавать null в качестве сетевого интерфейса. Документ Java говорит следующее:
«Начальное / значение по умолчанию для этой опции сокета может быть нулевым, чтобы указать, что исходящий интерфейс будет выбран операционной системой, обычно на основе таблиц сетевой маршрутизации».
Но что насчет входящих данных. Метод «join» всегда требует указания сетевого интерфейса и не позволяет мне передавать значение null.
В идеале я хотел бы присоединиться к группам многоадресной рассылки на том же интерфейсе, который используется для этой группы многоадресной рассылки для исходящих дейтаграмм по умолчанию.
Есть ли способ это сделать?
Я использую Java 8 и ОС Linux.