【问题标题】:Bidirectional/Loopback UDP in .net.net 中的双向/环回 UDP
【发布时间】:2011-02-05 20:07:55
【问题描述】:

我有一个应用程序需要在同一个端口上传输和接收。这可能在两种情况下发生:

  • PC 与远程硬件通信的位置。它“回复发送者”,因此数据报通过发送端口返回到我的 PC。

  • PC 与自身对话(环回模式)以进行测试和演示(测试应用通过 UDP 将虚假数据馈送到我们的主应用)。

这似乎只在尝试实现环回时失败。我可以让它工作的唯一方法是确保首先设置接收器 - 这是我无法保证的。

任何人都可以通过建议一种“正确”的方式来实现 UdpClient(s) 以可靠地处理上述情况,从而帮助缩小我的搜索范围吗?

(我发现与远程硬件可靠工作的唯一解决方案是以双向方式使用单个 UdpClient,尽管我正在使用可能会影响该发现的遗留代码。我尝试使用两个 UdpClients,但他们互相踩到脚趾 - 在某些情况下,一旦启动一个客户端,另一个客户端就无法连接。使用 ExclusiveAddressUse/ReuseAddress 设置以允许端口共享,我几乎可以让它工作,除了接收器必须先启动)

编辑

详细说明:

我们通过 UDP 与外部硬件通信。当它收到我们的通信时,它会回复源地址——所以我们会在同一个端口上接收回消息。这部分工作正常。

但是,如果我尝试使用环回模拟外部硬件(即我通过“给自己”的同一端口发送和接收),则只有在开始传输之前开始接收数据报时,我才能接收数据报。效果很好 - 但如果我发送然后尝试接收,我永远不会收到任何数据。在这种情况下,我实际尝试发送的内容无关紧要。

所以我有两个问题:

1) 如何管理可靠工作的环回。

2)如何在不破坏当前工作正常的外部通讯的情况下做到(1)!

由于我尝试了 1 或 2 个 UdpClient 的各种组合以及多种不同的设置(无济于事),我只是想知道是否有人设法让 UPD 环回正常工作,因为这可能会给我一个导致我可以在所有情况下工作的解决方案。

感谢您花时间考虑这个问题...

【问题讨论】:

  • 您能否澄清一下:硬件或测试应用程序是否向您的应用程序发送 UDP 数据包并返回响应?或者您的应用程序是否向硬件或测试应用程序发送数据包,然后这些发送响应?您能否编辑您的问题并显示各方之间的典型数据交换?
  • 按照 Mike Scott 的建议,请进一步澄清,以便您得到准确的答案。

标签: c# udp loopback


【解决方案1】:

这是设计使然。

与需要连接的 TCP 相比,UDP 通信的连接更少。

当从 UDP 发送数据时,它会被广播。这意味着它只对广播时还活着的接收者可用。

例子:

TCP 就像一个电话。来电者呼叫接收者。接收者接受呼叫并进行通信。如果接收者不可用,调用者将收到错误。(调用者是客户端,接收者是服务器侦听端口)

UDP 类似于 FM 无线电广播。无论是否有人在另一端收听,都会在收音机上播放一首歌。如果接收者打开收音机,他们就会收到这首歌。如果歌曲在 10:30 发送,而我的收音机在 10:30 开启,我可以听到这首歌。但如果我在 10 点 35 分打开我的 raido,那意味着我错过了它,再也听不到了。

更新

正如我所见,真正的问题是通过应用程序 X 在端口 1111(例如)上传输,并通过同一机器上的应用程序 Y 在端口 1111 上接收是您想要实现的目标。

同样,我可以建议 2 个解决方法(不好但可行)。

  1. 正如您所说,如果您在启动接收器后启动发射器,一切都很好。因此,只需尝试定期重新启动发射器的逻辑即可。

  2. 每次在 2 个端口上发送和接收。例如。 1111 和 2222。远程硬件将使用第一组 1111,演示应用程序将使用 2222。

【讨论】:

  • 感谢您花时间回答,但这并不能解释如何让环​​回工作。我不希望收到在开始收听之前发送的数据包,但我确实希望收到(至少一些)在我收听时发送的数据包
  • 为更新干杯。在情况(1)中它没有帮助。我必须完全释放端口(tx 和 rx),然后才能以“正确”的顺序重新启动并让它再次工作。情况(2)不是环回,所以不能解决问题。我接受了另一个答案,因为它提供了我能找到的最接近的解决方法,可以让环回工作。
【解决方案2】:

所以我想我理解你的问题。

你有

1- 将 UDP 数据发送到在端口 1234 上接收的硬件设备的客户端应用程序,同时此应用程序也在端口 1234 上接收响应。

2- 在端口 1234 上接收 UDP 数据并在端口 1234 上响应发送方的硬件设备。

所以当您在同一台机器上模拟硬件设备时,您最终会得到客户端应用程序和硬件模拟器都在同一 IP 地址 127.0.0.1 和端口 1234 上侦听 UDP 数据包?

我是否抓住了你所拥有的东西的精髓?

如果是这样,您是否考虑过为机器添加第二个 IP 地址。这意味着您需要有 2 张网卡,一张网卡可以有多个 IP 地址。这样,您可以将两个“设备”放在单独的界面上,这应该可以克服在同一界面上同时存在的任何冲突。

例如,如果您有两个 IP 地址192.168.0.5192.168.0.6

客户端应用程序可以发送到192.168.0.6 并在192.168.0.5 上接收 而硬件模拟器正在接收192.168.0.6 并响应192.168.0.5

这里是描述如何添加额外 IP 地址的链接。
http://www.itsyourip.com/networking/how-to-add-multiple-ip-address-in-windows-2000xp2003/

这适用于 2000/XP/2003,但过程与 Vista 和 Windows 7 类似。

【讨论】:

  • 谢谢克里斯。它开始看起来我无法实现实际的环回,并且必须放入一个特殊情况以用于演示目的(因此演示可以由对 UDP 技术知识最少的人运行),并实现一个运行的测试客户端在不同的 IP 上进行测试。
  • @Jason Williams,我认为走这条路会给你最可靠和一致的结果。
【解决方案3】:

在远离这段代码很久之后,我有机会再看一遍,并得出了解决这个问题的尴尬琐碎的解决方案。

事实证明,调用我的 UDP 类的客户端代码将其设置为发送和接收。因此,我实际上没有一个具有写访问权限的发送器和一个具有读访问权限的接收器,而是一个具有读/写权限的发送器和一个具有读/写权限的接收器。

这意味着如果首先初始化发送器,它也会尝试在该端口上接收,因此它会抓取所有传输的数据报。当接收器连接时,它永远不会收到任何数据,因为它正在被发送器消耗。

【讨论】:

    猜你喜欢
    • 2015-07-30
    • 1970-01-01
    • 2013-03-25
    • 2010-11-07
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多