2

我目前正在尝试制作一个在线视频游戏,该游戏目前使用 TCP 发送数据包。我想使用 UDP,但我对 UDP 非常陌生,并且遇到了一些问题。

当我在同一台计算机(本地主机)上测试我的服务器/客户端时,数据包似乎相互干扰。

例如,如果客户端向服务器发送一个数据包(UDP,127.0.0.1:1338),客户端最终会收到该数据包,因为客户端也在端口 1338 上侦听来自 127.0.0.1 的数据包。同样,当我尝试测试 2 个客户端和 1 个服务器,客户端可能会发送本应发送给服务器的数据包,但被另一个客户端接收。

由于所有数据包都从/发送到 127.0.0.1:1338,我如何在 localhost 上测试 UDP?我是否需要在我的数据包中实现某种层来区分数据包是用于服务器还是特定客户端?

4

3 回答 3

4

只有您的服务器应该侦听定义的端口号 (1338)。每个客户端应该选择一个空闲端口号并将这个端口号发送给服务器。服务器必须存储客户端信息,然后将数据包发送到此客户端列表中的客户端。

当客户端关闭时,客户端还应该发送一个再见数据包,以便在服务器端知道哪些客户端仍然可用,哪些不再参与。

您还应该在此客户列表中实施某种内务管理。例如,存储从客户端收到的最后一个数据包的时间戳,并从列表中删除一段时间未发送数据的客户端(客户端崩溃、连接丢失......)。

于 2013-09-03T06:38:08.873 回答
3

附加层将无济于事 - 因为服务器可能永远不会真正获得数据包。

使服务器和客户端上的端口可配置。这样,您可以在同一台机器上拥有不同的端口进行测试,并在投入生产时对其进行更改。请记住,您需要在客户端和服务器中配置两个端口。无论如何,这是一个很好的做法。

您还有另一个问题 - 多个客户端驻留在同一台机器上并侦听同一端口。您可以为每个客户端设置一个随机端口(客户端随机选择一个,然后通知服务器)。或者您可以尝试绑定到不同的 IP 地址(一个将使用 127.0.0.1,另一个将使用 PC 的真实 IP),但它不可扩展。

于 2013-09-03T06:18:55.037 回答
0

如果您打算在 LAN 设置中使用它,那么您始终可以根据发件人的地址过滤接收到的数据包——UDP 的 recvmsg() 允许您检索发件人的地址和端口号。如果您打算在 WAN 设置中使用它,那么除非您尝试进行多播,否则这可能不会成为问题。而且,即使使用多播,重复的数据包也不会发送回接收方。您可以使用 IP_MULTICAST_LOOP 禁用此选项。

于 2013-09-03T06:17:07.710 回答