【问题标题】:Java UDP multicast, determine which group sent packetJava UDP组播,判断哪个组发送了数据包
【发布时间】:2015-02-18 03:11:48
【问题描述】:

我正在制作一个应用程序,其中有一个特定线程 (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);

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

编辑:

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

【问题讨论】:

  • 我想一种解决方法是维护多个MulticastSocket 对象,每个你想加入的组一个。这样就很容易跟踪套接字和组之间的关联了。
  • 我确实想到了这一点,但它似乎过于夸张,特别是因为我可能有很多团体可以加入,而这(理论上)适用于受限的物联网设备。然后,我需要为每个 MulticastSocket 设置一个侦听器线程,这是我不想做的事情。

标签: java networking udp multicast


【解决方案1】:

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

【讨论】:

  • 我明白了。但是,套接字仍然只接受数据包,因为他已经加入了某个组,所以在某种程度上,关于数据包来自哪个组的信息必须是可用的,不是吗?就像对我的主要帖子的评论所说,如果我每个套接字只有一个组,这个信息会很明显,但我有多个。
  • 发送数据包的套接字可能加入了零个或多个组。因此,哪个组发送它的概念没有意义。您真正需要的是数据包发送到哪个组, 并且该信息在 C 级别可用,但据我所知,在 Java 级别不可用,除非它显示在修改DatagramSocketChannel.
  • 不幸。感谢您的回复,我用一个新的小问题编辑了我的主要帖子。
  • 我认为几十个套接字根本没有任何问题,可能几百个也没有。我会这样尝试,看看你是否有问题。如果这样做,您可以通过在非阻塞模式下使用 java.nio.channels.DatagramSocketChannelSelector. 来减少线程需求
【解决方案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 同时监听它们。

【讨论】:

  • 您无法在 Java 中“获取接收它的网络接口的 IP 地址”。您可以获取发送它的 IP 地址。
  • 是的,当然可以,这都是 vanilla 标准,可用于套接字对象。它是无法从接收到的数据报中检索到的 MC 组信息。我的文字不清楚你可以从哪里得到什么。我已经澄清了。
  • 可以获取socket绑定的接口,if是绑定的接口。如果它像通常那样绑定到 INADDR_ANY,则不能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-23
  • 2011-06-06
  • 1970-01-01
相关资源
最近更新 更多