【问题标题】:Testing UDP on localhost在 localhost 上测试 UDP
【发布时间】:2013-09-06 05:44:31
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c# sockets testing networking udp


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

        • 客户端选择空闲端口号有具体方法吗?还是我只是在某个范围内随机选择一个端口?
        • 您不必为 Socket 提供一个端口,它会自动从操作系统中获得一个免费的端口。请参阅 MSDN (msdn.microsoft.com/en-us/library/2b86d684.aspx) 中套接字构造函数的示例代码。没有绑定...
        • @Brad 对不起,我在之前的评论中犯了一个错误:当然你必须绑定你的客户端监听端口,但你不必指定端口号。只需传递 0 作为端口号。来自 MSDN Socket.Bind 文档 (msdn.microsoft.com/en-us/library/…):“如果您不关心使用哪个本地端口,您可以使用 0 作为端口号创建一个 IPEndPoint。在这种情况下,服务提供商将在1024 和 5000。”
        猜你喜欢
        • 2015-08-15
        • 2015-10-31
        • 1970-01-01
        • 1970-01-01
        • 2017-01-28
        • 1970-01-01
        • 2012-04-23
        • 2010-10-25
        • 1970-01-01
        相关资源
        最近更新 更多