2014-12-19 14 views
5

Ich mache eine Anwendung, wo gibt es einen bestimmten Thread (MulticastListenerThread), die eine MulticastSocket hat und auf UDP (Datagramm) -Pakete empfängt, die an die Multicast-Gruppe gesendet werden, die der Socket zuhört .Java UDP Multicast, bestimmen, welche Gruppe gesendet Paket

Das funktioniert. Ich kann einer Multicast-Gruppe beitreten, eine Nachricht an diese Gruppe senden und sie über die MulticastSocket empfangen.

Ich möchte jedoch aus Sicht des Empfängers feststellen, von welcher Multicast-Gruppe er das Paket erhalten hat. Der folgende Code gibt mir die Adresse des Urhebers des Pakets, nicht die Multicast-Gruppe:

DatagramPacket packet = new DatagramPacket(buf, buf.length); 
mlcSenderSocket.receive(packet); 
String src_addr = packet.getAddress().getHostAddress(); 

Der Code für das Senden des Pakets ist wie folgt:

InetAddress address = InetAddress.getByName(dest); 
packet = new DatagramPacket(payload, payload.length, 
    address, mlcEventPort); 
LLog.out(this,"[NC] MLC packet Sent to ev port MLC " + mlcEventPort 
    + " and to addr " + address); 
mlcSenderSocket.send(packet); 

Ist es überhaupt möglich, zu bestimmen Welche Gruppe hat das Paket gesendet?

Edit:

Es scheint dies nicht möglich ist. In Bezug auf die Auswirkungen auf die Leistung (ich arbeite für IoT-Geräte), wäre die Zuweisung eines Sockets pro Multicast-Gruppe (und damit ein Listener-Thread pro Gruppe) lebensfähig? Potentiell können viele Gruppen zusammengeschlossen werden (in Zehner- oder Hundertergruppen). Wenn es machbar ist, dann muss ich die beigefügte Gruppenadresse einfach irgendwo manuell behalten und bei Bedarf darauf verweisen. Vorschläge für andere Work arounds sind willkommen!

+0

Ich nehme an, eine Umgehung wäre, mehrere "MulticastSocket" -Objekte zu pflegen, eins für jede Gruppe, der Sie beitreten möchten. Es wäre dann leicht genug, den Zusammenhang zwischen Sockeln und Gruppen zu verfolgen. –

+0

Ich habe darüber nachgedacht, aber es scheint übermäßig übermäßig, vor allem da ich möglicherweise viele Gruppen beitreten könnte, und dies ist (in der Theorie) für Constrained IoT-Geräte gedacht. Ich müsste dann einen Listener-Thread pro MulticastSocket haben, etwas, das ich lieber nicht machen würde. –

Antwort

2

Nein Gruppe das Paket gesendet. Ein Socket an einer bestimmten IP-Adresse hat das Paket gesendet, und die Quell-IP-Adresse ist in DatagramPacket verfügbar. Multicast-Pakete stammen nicht aus Multicast-Gruppen, sie sind adressiert an Multicast-Gruppen.

+0

Ich verstehe. Aber der Socket akzeptiert nur das Paket, weil er einer bestimmten Gruppe beigetreten ist, also muss auf irgendeiner Ebene die Information darüber, aus welcher Gruppe das Paket stammt, verfügbar sein, nein? Wie der Kommentar zu meinem Hauptbeitrag sagte, wenn ich nur eine einzige Gruppe pro Socket hätte, wäre diese Information offensichtlich, aber ich habe mehrere. –

+0

Der Socket, der das Paket gesendet hat, kann sich mehreren oder mehreren Nullgruppen angeschlossen haben. Das Konzept, von welcher Gruppe es gesendet wurde, hat daher keine Bedeutung. Was Sie wirklich brauchen, ist die Gruppe, an die das Paket gesendet wurde *, und diese Information ist auf der C-Ebene verfügbar, aber nicht so weit ich auf der Java-Ebene weiß, es sei denn, sie erscheint in den Überarbeitungen von DatagramSocketChannel. ' – EJP

+0

unglücklich. Danke für die Antwort, ich habe meine Hauptpost mit einer kleinen neuen Frage bearbeitet. –

0

Ja, es ist wahr, dass Sie ein MulticastSocket zu mehreren Gruppen beitreten können, zum Beispiel:

InetAddress group; 

MulticastSocket s=new MulticastSocket(12345); 
NetworkInterface ni=NetworkInterface.getByName("eth1"); 

group=InetAddress.getByName("239.255.10.10"); 
s.joinGroup(new InetSocketAddress(group,12345),ni); 

group=InetAddress.getByName("239.255.10.11"); 
s.joinGroup(new InetSocketAddress(group,12345),ni); 

Sie erhalten dann Datagramme wie folgt aus:

DatagramPacket datagram=s.receive(datagram); 

Leider gibt es keine Java-API-Aufruf in der DatagramPacket Objekt, mit dem Sie bestimmen können, welche der beiden Gruppen vom Absender adressiert wurde, erhalten Sie nur die IP-Adresse der Netzwerkschnittstelle, auf der sie empfangen wurde (vom Socket) und die IP-Adresse des Absenders (aus dem Datagramm)).

Um zu erreichen, was Sie tun möchten, müssen Sie mehrere MulticastSocket Objekte erstellen und eine Gruppe pro Socket anhören. Sie könnten Ihre eigenen Threads oder NIO verwenden, um alle gleichzeitig zu hören.

+0

Sie können die IP-Adresse der Netzwerkschnittstelle nicht abrufen auf dem es in Java empfangen wurde. Sie können die IP-Adresse abrufen, von der es gesendet wurde. – EJP

+0

Ja natürlich können Sie, das ist alles Vanille Standard und verfügbar auf dem Socket-Objekt. Es ist die MC-Gruppeninformation, die nicht aus dem empfangenen Datagramm abgerufen werden kann. Mein Text war unklar, was Sie von wo bekommen können. Ich habe es geklärt. –

+0

Sie können die Schnittstelle abrufen, an die der Socket gebunden ist, wenn er an eine Schnittstelle gebunden ist. Wenn es wie gewöhnlich an INADDR_ANY gebunden ist, können Sie nicht. – EJP