2016-06-14 3 views
3

Следующий код работает только локально для меня. Я могу получить его на одной машине в другой программе. Я не вижу никакого трафика в wirehark (в Windows). Если я изменю адрес многоадресной рассылки на существующий адрес, например 10.10.10.10, я вижу UDP-пакет в wirehark.Почему DatagramSocket не передает по сети многоадресный адрес?

В wirehark я использую фильтр udp.port == 5353. Я могу видеть некоторые другие пакеты для адреса многоадресной рассылки, что я считаю, что мои настройки wirehark верны.

Брандмауэр отключен.

public static void main(String[] args) throws Exception { 
    byte[] buf = "some data".getBytes(); 
    DatagramSocket socket = new DatagramSocket(); 
    InetAddress address = InetAddress.getByName("224.0.0.251"); 
    socket.send(new DatagramPacket(buf, buf.length, address, 5353)); 
} 

EDIT: Причина, кажется, петлевой адаптер (Microsoft Loopbackadapter für KM-TEST). Если я удалю петлевой адаптер, тогда он будет работать. В другой системе есть адаптер VMware, который может создать равную проблему.

Почему пакет не отправляется всем сетевым адаптерам? Как я могу отправить его на правильный адаптер?

+1

Что вы настройки сети? Что такое сетевая маска? –

+0

@BoristheSpider Посмотреть мое редактирование. – Horcrux7

ответ

1

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

Предполагая, что IP-интерфейса вы хотите отправить на это 10.10.10.1, вы должны сделать следующее:

public static void main(String[] args) throws Exception { 
    byte[] buf = "some data".getBytes(); 
    MulticastSocket socket = new MulticastSocket(); 
    socket.setNetworkInterface(NetworkInterface.getByInetAddress(
           InetAddress.getByName("10.10.10.1"))); 
    InetAddress address = InetAddress.getByName("224.0.0.251"); 
    socket.send(new DatagramPacket(buf, buf.length, address, 5353)); 
} 
+0

Вам нужно указать интерфейс, если он не является маршрутом по умолчанию для диапазона адресов многоадресной передачи. – EJP

+0

@EJP Для многоадресной рассылки обычно нет маршрута по умолчанию. – Horcrux7

+0

@dbush Спасибо, я отправляю его всем действительным сетевым интерфейсам сейчас, и он работает. – Horcrux7

1

224.0.0/24 является reserved:

Локальный блок управления сетью (224.0.0/24)

Адреса в блоке управления локальной сети используются для трафика протокола управления , который не переадресован.

Вы не можете использовать его.

+0

Да, это диапазон адресов многоадресной рассылки. – Horcrux7

+1

@ Horcrux7 Нет, это диапазон для локального сетевого блока управления * sub * - диапазон многоадресных адресов. – EJP

1

@ EJP верен. Вы не можете использовать этот адрес в качестве многоадресного адреса.

Диапазон адресов между 224.0.0.0 и 224.0.0.255 включительно, зарезервировано для использования протоколов маршрутизации и других низкого уровня протоколов обнаружения топологии или технического обслуживания, таких как обнаружение шлюза и членства в группе составление отчетов. Многоадресные маршрутизаторы не должны пересылать любую многоадресную дейтаграмму с адресами адресатов в этом диапазоне, независимо от ее TTL.

Источник: IANA - IPv4 Multicast Address Space Registry

Другими словами, выбранный групповой адрес не должен работу, даже если она находится в диапазоне адресов многоадресной рассылки.

+0

Это адрес многоадресной DNS. Но это еще одна тема и не связана с проблемой.https://en.wikipedia.org/wiki/Multicast_DNS – Horcrux7

+1

@ Horcrux7 Вы не можете ссылаться на Википедию против RFC. И [Википедия не является надежным ресурсом] (https://en.m.wikipedia.org/wiki/Wikipedia:Wikipedia_is_not_a_reliable_source). Если вы пытаетесь использовать mDNS, вам нужно выяснить способ настройки MAC-адреса, который вы не можете сделать на Java. – EJP

+0

@EJP, что вы имеете в виду при настройке MAC-адреса? Он работает сейчас. – Horcrux7

Смежные вопросы