Пример программы Java Multicast не может доставлять пакеты в локальной сети (между хостами)

Я изучаю и пытаюсь понять, как многоадресная рассылка реализована в Java. Я разработал небольшую программу, следуя примеру, приведенному на http://www.nmsl.cs.ucsb.edu/MulticastSocketsBook/#javaexamples и выполняла многоадресную рассылку пакетов дейтаграмм (UDP) нескольким клиентам на одном хосте.

Однако, когда я пытался запускать клиентов на разных машинах (в одной локальной сети (например, в моем домашнем WiFi), на стороне клиента не было получено никаких пакетов. Я убедился, что брандмауэр моего маршрутизатора отключен, а на всех других машинах был открыт порт.

Думая, что в моей программе может быть какая-то ошибка, я взял примеры, скомпилировал их и запустил сервер и клиент на разных машинах, но результат тот же (нет доставки пакетов на разные машины). Я даже пытался запустить клиент на Ubuntu (в VirtualBox с адаптером Bridge), но безуспешно.

Пройдя SO, я наткнулся на Java Multicast Time To Live всегда равен 0 объяснение проблемы с заголовком TTL в многоадресной рассылке Java. Поэтому я применил предложение, представленное в ответе на этот вопрос, но все еще та же проблема. Я отследил пакеты с помощью WireShark и убедился, что значение TTL действительно равно 5 (я установил его равным 5, чтобы увеличить вероятность!)

Я не уверен, где я делаю неправильно. Я был бы очень признателен, если бы вы могли указать мне правильное направление.

P.S. : я использовал многоадресные адреса, такие как 235.1.1.1 / 239.255.211.111 и порт 4466 (этот порт я держал открытым в брандмауэре всех машин для входящего + исходящего n/w)


person jatanp    schedule 12.12.2011    source источник
comment
Скажите, является ли ваш локальный хост multi-homed или нет; то есть наличие более одного сетевого интерфейса. Если вы это сделаете, вам нужно использовать третий конструктор класса DatagramSocket, где вам нужно указать локальный порт и локальный IP-адрес привязки вашего предпочтительного сетевого интерфейса.   -  person ecle    schedule 12.12.2011
comment
Интересно, у меня те же проблемы, что и у вас, в моем Java-проекте прямо в эту секунду! Я сам не уверен в решении...   -  person Oliver Spryn    schedule 12.12.2011
comment
Если вы находитесь в настройке multi-homed и используете класс MulticastSocket, используйте setInterface(inetAddress) для установки IP-адреса привязки вашего предпочтительного сетевого интерфейса.   -  person ecle    schedule 12.12.2011
comment
Если все, что я сказал, по-прежнему терпит неудачу, то я подозреваю, что ваш маршрутизатор локальной сети не транслирует многоадресную рассылку http://stackoverflow.com/questions/2656590/how-do-i-make-my-multicast-программа-работа-между-компьютерами-в-разных-сетях   -  person ecle    schedule 12.12.2011
comment
@ееее ты супер. Моя розетка каким-то образом подключалась к адаптеру VirtualBox n/w вместо моего адаптера Wi-Fi! Я не знаю, почему так происходит! Пожалуйста, оставьте свой комментарий как ответ, и я отмечу его как принятый ответ. Большое спасибо.   -  person jatanp    schedule 12.12.2011
comment
можете ли вы объяснить это с помощью setInterface(inetAddress) в multicastSocket? как мне получить свой сетевой интерфейс inetAddress? @jatanp   -  person dumazy    schedule 18.10.2012
comment
@dumazy в Windows вы можете запустить ipconfig или ifconfig в Linux, чтобы узнать доступные интерфейсы и их назначенные / выделенные IP-адреса. Если у вас есть DHCP, то, вероятно, вы можете сканировать доступные IP-адреса, используя следующий фрагмент: for(InetAddress ia: InetAddress.getAllByName(InetAddress.getLocalHost().getHostName())) { System.out.println(ia); } Попробуйте сопоставить требуемую подсеть, чтобы выбрать адрес сетевого интерфейса (например, ia) в цикле и выполнить привязку к этому интерфейсу.   -  person jatanp    schedule 16.01.2013