【问题标题】:Bidirectional UDP Multicast双向 UDP 组播
【发布时间】:2015-07-30 15:51:04
【问题描述】:

我正在为游戏服务器编写网络后端。

我计划使用多播,以便客户端可以通过多播套接字绑定到服务器。然后服务器可以将游戏更新发送给该组的所有成员。

不过,我想知道,如果可以进行反向操作——客户端能否通过与多播套接字相同的端口向服务器发送单播数据

我已经编写了一个基于Java Tutorials 的测试程序(它只发送服务器-> 客户端),但我无法使其适应双向通信。我在客户端收到 Address already in useNot a multicast address 错误。

我的怀疑是否正确,即无法使用同一端口进行此类双向通信?我必须使用不同的端口(一个用于多播 [服务器 —> 客户端],一个用于单播 [客户端 —> 服务器])?

(我在 Java 中执行此操作,但我更感兴趣的是网络方面的事情这可能吗 与实现方面我该怎么做。)

【问题讨论】:

  • 多播是单向的(服务器 -> 客户端)。服务器不能使用同一个绑定的 IP:Port 对来接收数据,它必须使用不同的 IP:Port 对。
  • @RemyLebeau 你是从哪里得到这个想法的?

标签: java sockets networking udp multicast


【解决方案1】:

客户端能否通过与多播套接字相同的端口向服务器发送单播数据?

可以,只要套接字没有绑定到多播地址。显然 Linux 需要这个,但其他平台允许你将它绑定到 0.0.0.0。

请注意,您要问的不是“双向多播”。它在一个方向上是多播的,而在另一个方向上是单播的。

【讨论】:

  • 但是服务器正在在另一个方向使用多播。
  • @baum 服务器不必绑定到多播地址来做到这一点。除了,显然,在 Linux 上,出于我从未理解的原因。它甚至不必加入多播组。只有多播接收者(客户端)需要这样做。
  • 我应该纠正那个。发件人根本不需要绑定。 接收者可能需要绑定到多播地址。
【解决方案2】:

是的,这是可能的。

假设 IP 地址为 192.168.1.2 的服务器想要向 224.1.2.3 的 2222 端口发送多播消息,并在端口 1111 上接收单播响应。在服务器端,将数据报套接字绑定到地址/端口 0.0.0.0:1111 .在客户端,将数据报套接字绑定到 0.0.0.0:2222,然后为多播组 224.1.2.3 注册套接字。服务器在绑定其本地端口时可以选择指定 192.168.1.2,但不是必需的。客户端必须绑定0.0.0.0,否则Linux系统上收不到多播包。

当服务器要发送时,它会指定消息和目的地的 IP/端口。在这种情况下,服务器使用其数据报套接字发送到 224.1.2.3:2222,但如果您愿意,您可以稍后发送到不同的地址/端口。生成的数据包的源 IP/端口为 192.168.1.2:1111,目标 IP/端口为 224.1.2.3:2222。

为了让客户端发送回服务器,它指定了消息和目标的 IP/端口,在本例中为 192.168.1.2:1111。因此,生成的数据包的源 IP/端口为 {client_IP}:2222,目标端口为 192.168.1.2:1111。只需要服务端一个socket,每个客户端一个socket。

【讨论】:

  • 我明白了。我的错误是我试图将多播套接字绑定到服务器本身,而不是任意多播组。
  • (我也想要一个端口,不是一个发送一个接收)
  • 对客户端和服务器使用相同的端口号应该不是问题,只要它们不在同一台机器上运行。
  • 允许服务器使用相同的本地端口号进行发送和接收。虽然我想这并不重要。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多