我正在为游戏服务器编写网络后端。
我计划使用多播,以便客户端可以通过多播套接字绑定到服务器。然后,服务器可以向该组的所有成员发送游戏更新。
我想知道,如果可以执行反向 - 客户端是否可以通过与多播套接字相同的端口向服务器发送单播数据?
我已经编写了一个基于Java Tutorials(仅发送服务器 - >客户端)的测试程序,但我无法使其适应双向通信。我在客户端上收到Address already in use
和Not a multicast address
错误。
我的怀疑是否正确使用同一端口无法进行此类双向通信?我必须使用不同的端口(一个用于多播[server - > clients],一个用于单播[clients - > server])?
(我在Java中这样做,但我对网络方面更感兴趣这可能与实现方我该怎么做。)
答案 0 :(得分:1)
是的,这是可能的。
假设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。服务器上只有一个套接字,每个客户端只需一个套接字。
答案 1 :(得分:0)
客户端可以通过与组播套接字相同的端口向服务器发送单播数据吗?
是的,只要套接字没有绑定到多播地址。显然Linux需要这个,但是其他平台允许你将它绑定到0.0.0.0。
请注意,您所询问的不是双向多播'。它是在一个方向上组播,在另一个方向上是单播。