当前位置: 首页 > 知识库问答 >
问题:

在localhost上测试UDP

邵正雅
2023-03-14

我目前正在尝试做一个网络视频游戏,目前使用TCP发送数据包。我想使用UDP,但是我对UDP非常陌生,我遇到了一些问题。

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

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

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

共有3个答案

华君浩
2023-03-14

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

赵超
2023-03-14

额外的一层将不会有所帮助——因为服务器可能永远也不会真正得到数据包。

使服务器和客户机上的端口可配置。这样,您可以在同一台机器上使用不同的端口进行测试,并在投入生产时进行更改。请记住,您需要在客户机和服务器上都配置这两个端口。反正这是一个很好的做法。

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

严誉
2023-03-14

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

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

您还应该在此客户端列表中实现某种内务处理。例如,存储上次从客户端接收到的数据包的时间戳,并从列表中删除一段时间没有发送数据的客户端(崩溃的客户端、丢失的连接…)。

 类似资料:
  • 我们为 Linux 做了一个试验。 为了测试它,在你的测试目录中按如下内容创建 Package.swift: import PackageDescription let package = Package( name: "MyShinyUnicornCat", dependencies: [ .Package(url: "https://github.com/Rea

  • (我之前问过一个类似的问题,所以我将尝试一个更一般的形式,看看是否有人知道如何做到这一点。)有一个Java库,我在其中添加了Android支持补丁。我想自动测试代码,但为了检查它是否在Android上正常运行,我需要在Android上测试它。不过,库工件是一个jar,而不是AAR或APK,所以我不想删除旧的构建模式,到目前为止,我尝试添加Gradle Android插件时产生了一些错误,比如

  • 行动时刻 - 使用JRadius Simulator在FreeRADIUS上测试EAP 我们将首先为JRadius Simulator准备FreeRADIUS环境,然后配置JRadius Simulator以测试EAP身份验证。 准备FreeRADIUS FreeRADIUS可以处理EAP之前最重要的事情就是什么。 当你无所作为时,EAP将发挥最佳作用。 FreeRADIUS作者确保默认配置支持E

  • 问题内容: 我正在为已经存在很长时间的应用程序编写单元测试。我需要测试的一些方法是这样构建的: 如果要测试这些方法,则必须在单元测试中编写如下代码: 这样做是一种好习惯吗?还是有其他方法可以测试这些方法? 我在Internet上进行了一些研究,发现了一些带有和的注释解决方案,但这是行不通的(Eclipse不断在测试中显示错误行)。我不知道这些是否是好的解决方案,因为对于整个单元测试而言,我还是一个

  • 我们正在测试Docusign在业务应用程序的审批流中的使用。我们使用OAuth解决方案进行服务集成,即JWT(JSONWeb令牌)流。 当我打电话给apiClient时。配置JWTAuthorizationFlow方法在IIS Localhost中托管的应用程序中,我获得OAuthToken并可以发送信封。 但是,当我在测试服务器上部署解决方案时,使用相同的userId、integratorKey

  • 问题内容: 是否可以像使用JUnit一样(使用getName()或rules)检索当前正在运行的测试名称? PS我不想使用基于堆栈跟踪的一些自写工具。 问题答案: 根据位于http://testng.org/doc/documentation- main.html的 TestNG文档, 您可以实现可能有助于您解决问题的侦听器。 查看5.16节的TestNG侦听器,尤其是IInvokedMethod