双向 UDP 组播

Bidirectional UDP Multicast

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

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

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

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

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

(我在 Java 中这样做,但我对网络方面的事物更感兴趣 这可能吗 与实现-边 我该怎么做。)

can clients send unicast data to the server, over the same port as the multicast socket?

是的,只要套接字未绑定到多播地址。显然 Linux 需要这个,但是其他平台允许你将它绑定到 0.0.0.0.

请注意,您问的不是 'bidirectional multicast'。它在一个方向上是多播的,在另一个方向上是单播的。

是的,这是可能的。

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

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

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