2

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

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

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

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

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

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

编辑

详细说明:

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

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

所以我有两个问题:

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

2)如何做(1)而不破坏当前工作正常的外部通讯!

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

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

4

3 回答 3

5

这是设计使然。

与需要连接的 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。

于 2010-05-24T11:17:05.520 回答
3

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

你有

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.5192.168.0.6192.168.0.5

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

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

于 2010-05-24T16:40:55.820 回答
0

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

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

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

于 2011-02-05T12:07:55.213 回答