Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java UDP多播,确定发送数据包的组_Java_Networking_Udp_Multicast - Fatal编程技术网

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

Java UDP多播,确定发送数据包的组,java,networking,udp,multicast,Java,Networking,Udp,Multicast,我正在制作一个应用程序,其中有一个特定的线程(MulticastListenerThread),它有一个MulticastSocket,正在侦听发送到套接字也在侦听的多播组的UDP(数据报)数据包 这很有效。我可以加入多播组,向该组发送消息并通过多播套接字接收消息 然而,我想从接收者的角度确定他从哪个多播组接收数据包。以下代码为我提供了数据包发起人的地址,而不是多播组的地址: DatagramPacket packet = new DatagramPacket(buf, buf.length);

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

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

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

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);
是否有可能确定是哪个组发送了数据包

编辑:

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

没有组发送该数据包。特定IP地址的套接字发送数据包,源IP地址在
数据包中可用。多播数据包不是来自多播组,而是发往多播组。

是的,确实可以将
多播套接字
加入多个组,例如:

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同时监听所有线程。

我想一种解决方法是维护多个
MulticastSocket
对象,每个组对应一个对象。然后,跟踪套接字和组之间的关联就足够容易了。我确实想到了这一点,但这似乎太过分了,特别是因为我认为可能有许多组要加入,而这(理论上)是针对受限物联网设备的。然后我会被要求在每个多播套接字上有一个侦听器线程,这是我不愿意做的。我理解。但是,套接字只接受数据包,因为他加入了某个组,所以在某种程度上,关于数据包来自哪个组的信息必须是可用的,不是吗?正如我在主要帖子中的评论所说,如果我每个套接字只有一个组,那么这个信息是显而易见的,但我有多个。发送数据包的套接字可能加入了零个或多个组。因此,究竟是哪一个团体发送了它的概念没有任何意义。您真正需要的是数据包被发送到哪个组,并且该信息在C级别可用,但据我所知,在Java级别不可用,除非它显示在对DatagramSocketChannel的修订中。
。谢谢你的回复,我用一个新的小问题编辑了我的主要帖子。我看不出几十个插座有任何问题,也许几百个插座没有问题。我会用那种方式试试看你是否有问题。如果这样做,您可以通过在非阻塞模式下使用
java.nio.channels.DatagramSocketChannel
选择器来减少线程需求。
您无法在java中“获取接收到它的网络接口的IP地址”。您可以获取发送它的IP地址。是的,当然可以,这都是标准的,在socket对象上可用。无法从接收到的数据报中检索MC组信息。我的文字不清楚你能从哪里得到什么。我已经解释清楚了。如果套接字绑定到接口,那么就可以得到它绑定到的接口。如果像往常一样,它一定会让你失望,那你就不能。