Java UDP多播,确定哪个组发送了数据包

时间:2014-12-19 07:45:08

标签: java networking udp multicast

我正在创建一个应用程序,其中存在某个线程(MulticastListenerThread),该线程具有MulticastSocket并且正在侦听发送到套接字正在侦听的多播组的UDP(数据报)数据包。

这很有效。我可以加入组播组,向该组发送消息并通过MulticastSocket接收它。

但是,我想从接收者的角度确定他收到的数据包组播组。以下代码为我提供了数据包发起者的地址,而不是多播组:

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

发送数据包的代码如下:

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

是否可以确定哪个组发送了数据包?

编辑:

看来这是不可能的。 在性能影响方面(我正在为IoT设备工作),为每个多播组分配一个套接字(因此,每个组的一个监听器线程)是否可行?可能会加入许多群体(数十或数百甚至)。如果它是可行的,那么我只需要手动将连接的组地址保留在某处并在必要时引用它。 欢迎提出其他工作建议!

2 个答案:

答案 0 :(得分:2)

没有组发送了数据包。发送数据包的特定IP地址的套接字,DatagramPacket中提供了源IP地址。多播数据包不是来自多播组,而是寻址到多播组。

答案 1 :(得分:0)

是的,您可以将MulticastSocket加入多个群组,例如:

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

然后您会收到如下数据报:

DatagramPacket datagram=s.receive(datagram);

不幸的是,DatagramPacket对象中没有允许您确定发件人所针对的两个组中的哪一个的Java API调用,您只能获得它所在的网络接口的IP地址。收到(来自套接字)和发件人的IP地址(来自数据报)。

要实现您想要的功能,您需要创建多个MulticastSocket对象并在每个插槽中侦听一个组。您可以使用自己的线程或NIO同时收听它们。