Назначение joinGroup () в MulticastSocket - PullRequest
1 голос
/ 26 мая 2011

Я пытаюсь присоединиться к многоадресной группе после создания MulticastSocket.

Делать что-то вроде:

MulticastSocket mySocket = new MulticastSocket(4444);
mySocket.joinGroup(InetAddress.getByName("230.0.0.1")); // as an example

отлично работает. Когда я использую конструктор MulticastSocket, который принимает SocketAddress в качестве параметра, группа многоадресной рассылки не присоединяется, и требуется отдельный вызов метода joinGroup ().

MulticastSocket mySocket = new MulticastSocket(new InetSocketAddress("230.0.0.1", 4444));

Почему это?

Спасибо!

Ответы [ 5 ]

6 голосов
/ 26 мая 2011

Если я не ошибаюсь, многоадресная рассылка реализуется путем регистрации с помощью локального сетевого коммутатора (с использованием метода joinGroup, который отправляет сообщение IGMP), а затем коммутатор будет пересылать все пакеты, отправленные на адрес многоадресной рассылки, на каждое зарегистрированное устройство , Если вы не вызываете joinGroup, сообщение о регистрации группы не отправляется, локальный коммутатор не имеет ни малейшего представления о том, что вы заботитесь о сообщениях, и поэтому вы фактически не получаете никаких сообщений.

Некоторые коммутаторы более строгие, чем другие, в отношении отправки: я видел некоторые коммутаторы, где устройство могло отправлять отправленные в группу многоадресной рассылки без регистрации, но не получать пакеты в группу многоадресной рассылки, и я видел другие коммутаторы, где устройство пришлось зарегистрироваться для успешной отправки другим членам группы многоадресной рассылки или получения пакетов, отправленных в группу многоадресной рассылки.

0 голосов
/ 16 апреля 2012

Femi правильно: вам нужно позвонить joinGroup(), чтобы сообщить вашей сети, что вы заинтересованы в получении пакетов для этой многоадресной группы. (Имейте в виду, что весь IP-трафик является широковещательным трафиком; именно поэтому Wireshark и другие «разнородные» программы работают.)

Конструктор, который берет IP-адрес, не указывает группу для присоединения: он указывает, какую из ваших сетевых карт использовать. Если вы не укажете IP-адрес самой карты, вы запрашиваете карту, которая направляет сообщения на указанный вами адрес. (Вау, это много уточнений.) Так что вам все равно нужно joinGroup() потом; просто только карта, которую вы ... указали ... будет получать пакеты.

0 голосов
/ 26 мая 2011

Когда я использую конструктор MulticastSocket, который принимает SocketAddress в качестве параметра, хотя, многоадресная группа не присоединена и отдельный вызов на joinGroup () требуется.

Параметр в конструкторе может быть нулевым. Таким образом, конструктор может не вызывать joinGroup. Более того, в документе говорится, что он только связывает.

Я думаю, что не вызывать joingGroup () в конструкторе - это просто стандартная практика Java. Если бы конструктор класса это сделал, пользователь потерял бы возможность контролировать, когда вызывается этот метод.

Он / она может захотеть подготовить структуру данных до присоединения к группе или может подождать, пока пользовательский сигнал или какой-то другой процесс завершится.

0 голосов
/ 26 мая 2011

Если вы не создаете MulticastSocket с групповым адресом, вы должны присоединиться к группе другим способом. В противном случае, почему вы должны получать сообщения для этой группы?

Создание NB с групповым адресом не работает на всех платформах AFAIK. Фактически, конструктор, который принимает SocketAddress, указан для использования его в качестве локального адреса привязки, а не группы многоадресной рассылки. Я считаю, что указание группового адреса работает на Linux, но не на некоторых других платформах. Я бы использовал его так, как он задокументирован, и явно вызвал joinGroup (). Обратите внимание, что на многосетевых хостах вам может потребоваться вызвать joinGroup () для каждого доступного NIC.

0 голосов
/ 26 мая 2011

Я думаю, что именно так был разработан протокол многоадресной рассылки / RFC. До вызова joinGroup приложение будет игнорировать все многоадресные дейтаграммы. Это "joinGroup", которая заставляет приложение принимать пакеты.

Подробнее об этом здесь: http://tldp.org/HOWTO/Multicast-HOWTO-2.html

Перейти к разделу Присоединение к группе многоадресной рассылки. по конкретной ссылке выше.

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