2014-12-19 18 views
5

Sto creando un'applicazione in cui è presente un determinato thread (MulticastListenerThread) che ha un MulticastSocket e sta ascoltando i pacchetti UDP (datagram) inviati al gruppo multicast che anche il socket sta ascoltando .Multicast Java UDP, determinare quale gruppo ha inviato il pacchetto

Questo funziona. Posso unirmi a un gruppo multicast, inviare un messaggio a quel gruppo e riceverlo tramite MulticastSocket.

Tuttavia, vorrei determinare, dal punto di vista del ricevitore, da quale gruppo multicast ha ricevuto il pacchetto. Il seguente codice mi dà l'indirizzo del mittente del pacchetto, non il gruppo multicast:

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

Il codice per l'invio del pacchetto è la seguente:

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); 

E 'del tutto possibile determinare quale gruppo ha inviato il pacchetto?

Modifica:

Sembra che questo non sia possibile. In termini di impatto sulle prestazioni (sto lavorando per dispositivi IoT), l'assegnazione di un socket per gruppo multicast (e quindi un thread listener per gruppo) può essere valida? Potenzialmente possono essere uniti molti gruppi (in termini di decine o anche di centinaia). Se è fattibile, allora ho solo bisogno di mantenere l'indirizzo del gruppo congiunto da qualche parte manualmente e fare riferimento ad esso, se necessario. I suggerimenti per altri lavori sono ben accetti!

+0

Suppongo che una soluzione sia mantenere più oggetti 'MulticastSocket', uno per ciascun gruppo a cui si desidera partecipare. Sarebbe quindi abbastanza facile tenere traccia dell'associazione tra prese e gruppi. –

+0

Ci ho pensato, ma sembra eccessivamente eccessivo, soprattutto dal momento che potrebbero esserci potenzialmente molti gruppi da aggiungere e questo è (in teoria) pensato per dispositivi IoT vincolati. Mi sarebbe quindi richiesto di avere un thread listener per MulticastSocket, qualcosa che preferirei non fare. –

risposta

2

Nessun gruppo ha inviato il pacchetto. Un socket con uno specifico indirizzo IP ha inviato il pacchetto e l'indirizzo IP di origine è disponibile nello DatagramPacket. I pacchetti multicast non provengono da gruppi multicast, sono indirizzati a per i gruppi multicast.

+0

Capisco. Tuttavia, il socket accetta solo il pacchetto perché è entrato in un determinato gruppo, quindi a un certo livello le informazioni su quale gruppo il pacchetto ha origine devono essere disponibili, no? Come il commento al mio post principale ha detto, se ho solo un singolo gruppo per socket, questa informazione sarebbe ovvia, ma ho più. –

+0

Il socket che ha inviato il pacchetto potrebbe essere stato associato a zero gruppi o diversi. Il concetto di quale gruppo l'ha inviato quindi non ha significato. Quello di cui hai veramente bisogno è il gruppo a cui è stato inviato il pacchetto *, * e che l'informazione è disponibile a livello C, ma non per quanto ne so a livello Java, a meno che non si presenti nelle revisioni di 'DatagramSocketChannel. ' – EJP

+0

sfortunato. Grazie per la risposta, ho modificato il mio post principale con una piccola nuova domanda. –

0

Sì, è vero che si può partecipare a una MulticastSocket a più gruppi, per esempio:

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); 

Si riceve datagrammi in questo modo:

DatagramPacket datagram=s.receive(datagram); 

Purtroppo non v'è alcuna chiamata API Java nel DatagramPacket oggetto che ti consentirà di determinare quale dei due gruppi è stato scelto dal mittente, tutto quello che puoi ottenere è l'indirizzo IP dell'interfaccia di rete su cui è stato ricevuto (dal socket) e l'indirizzo IP del mittente (dal datagramma).

Per ottenere ciò che si desidera è necessario creare più oggetti MulticastSocket e ascoltare un gruppo per socket. Puoi usare i tuoi thread o NIO per ascoltarli tutti contemporaneamente.

+0

Non puoi 'ottenere l'indirizzo IP dell'interfaccia di rete su cui è stato ricevuto "in Java. È possibile ottenere l'indirizzo IP dal quale è stato inviato. – EJP

+0

Sì, certo che puoi, è tutto standard vaniglia e disponibile sull'oggetto socket. Sono le informazioni sul gruppo MC che non possono essere recuperate dal datagramma ricevuto. Il mio testo non è chiaro su cosa puoi ottenere da dove. L'ho chiarito. –

+0

È possibile ottenere l'interfaccia a cui è collegato il socket, * se * è associato a un'interfaccia. Se è associato a INADDR_ANY, come al solito, non è possibile. – EJP