有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

网络Java UDP多播,确定发送数据包的组

我正在制作一个应用程序,其中有一个特定的线程(MulticastListenerThread),它有一个MulticastSocket,正在侦听发送到socket也在侦听的多播组的UDP(数据报)数据包

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

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

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

是否有可能确定是哪个组发送了数据包

编辑:

看来这是不可能的。 就性能影响而言(我为物联网设备工作),为每个多播组分配一个socket(从而为每个组分配一个侦听器线程)是否可行?可能会加入许多组(以十个甚至数百个为单位)。如果它是可行的,那么我只需要手动将加入的组地址保留在某个位置,并在必要时引用它。 欢迎对其他工作方法提出建议


共 (2) 个答案

  1. # 1 楼答案

    No组发送数据包。特定IP地址的套接字发送数据包,源IP地址在DatagramPacket中可用。多播数据包不是来自多播组,而是寻址到多播组

  2. # 2 楼答案

    是的,您确实可以将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同时监听它们