【问题标题】:Port-forwarding a Multicast IP端口转发多播 IP
【发布时间】:2020-04-20 20:57:21
【问题描述】:

我花了一些时间学习 UDP 连接,尤其是 Java 中的多播套接字。

我能够在我的本地网络上创建一个简单的多播套接字“群聊”,但我一直在尝试将其扩展到本地网络之外。

为了实现这一点,我在我的路由器上端口转发了一个 D 类 IP 地址,以允许其他人从我的网络外部访问我的多播组。

但是,当尝试通过我的公共 IP 和指定端口(在端口转发期间)连接到我的“群聊”时,我会收到以下错误消息...

Exception in thread "main" java.net.SocketException: Not a multicast address
at java.net.MulticastSocket.joinGroup(MulticastSocket.java:310)
...

这个错误是有道理的,因为我的公共 IP 不是 D 类地址。但是既然我端口转发了一个多播地址到我路由器上的指定端口,那应该不会出现这个问题吧?

这是我的代码的相关部分...

InetAddress group = InetAddress.getByName("192.___.___.___"); // my public IP
MulticastSocket socket = new MulticastSocket(1234); // the port-forwarded port
socket.joinGroup(group);

我在哪里出错了,我该如何解决这个问题?

【问题讨论】:

  • 组播路由与单播路由有很大不同。组播仅限于单个 LAN,除非路径中的所有路由器都配置了组播路由,这就是您无法在 Internet 上进行组播的原因。端口转发用于单播 NAPT,而不是多播。如果通过 Internet 建立隧道,则可以在站点之间使用多播,但并非所有隧道协议都支持多播。

标签: java networking multicast portforwarding multicastsocket


【解决方案1】:

组播地址在224.0.0.0 - 239.255.255.255 之间,针对不同的场景有不同的子范围。更多内容:https://en.wikipedia.org/wiki/Multicast_address

因此,通过尝试加入 192.x.y.z 的组,这是一个无效的多播地址。这就是引发异常的原因。

我可能弄错了,我怀疑大多数消费者/家庭 NAT,更不用说 ISP 支持多播流量了。 (提出问题 - 无论 MBONE 发生了什么 - 我认为它会起飞并成为所有问题的解决方案。)

听起来您需要的是一个代理程序,它拦截多播流量并将其通过隧道传送到运行相同代码的不同网络上的代理。代理依次接收隧道数据包并重定向回多播\广播组。

使用广播套接字而不是多播可能会更好。

【讨论】:

  • It sounds like what you need is a proxy program that intercepts multicast traffic and tunnels it to a proxy on a different network running the same code. 可能会出现同样的问题。由于地址不在标准范围内,android 仍然会阻塞地址。非常烦人的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 2015-03-07
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
  • 2018-12-24
  • 1970-01-01
相关资源
最近更新 更多