.net中的双向/环回UDP

时间:2010-05-17 11:37:38

标签: c# udp loopback

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

  • PC正在与一块远程硬件通信。它“回复发件人”,因此数据报通过发送端口返回我的PC。

  • PC正在与自己交谈(环回模式)进行测试和演示(测试应用程序通过UDP将假数据输入我们的主应用程序)。

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

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

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

修改

详细说明:

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

但是,如果我尝试使用环回来模拟外部硬件(即我通过相同的端口发送和接收“给自己”),如果我在开始发送之前开始接收,我只能接收数据报。这工作正常 - 但如果我传输然后尝试接收,我从来没有收到任何数据。在这种情况下,我实际尝试发送的内容无关紧要。

所以我有两个问题:

1)如何管理可靠运行的环回。

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

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

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

3 个答案:

答案 0 :(得分:5)

这是设计的。

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

从UDP发送数据时,它会被广播。这意味着它只适用于广播时活着的接收器。

示例:

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

UDP就像FM广播一样。无论是否有人在另一端听,都会在收音机上播放一首歌。如果接收器已经放置了他们的收音机,他们就会收到这首歌。如果歌曲在10:30发送,我的收音机在10:30开启,我可以听到这首歌。但是如果我把我的raido设置在10:35,那就意味着我已经错过了它并且再也听不到它了。

<强>更新

正如我所看到的,真正的问题是在端口1111上传输(例如),虽然应用程序X和通过SAME机器上的应用程序Y在端口1111上接收是你想要实现的。

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

  1. 如你所说,如果你在启动接收器后启动发射器,一切都很好。因此,请尝试定期重新启动发射机的逻辑。

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

答案 1 :(得分: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.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的过程类似。

答案 2 :(得分:0)

经过很长一段时间远离这段代码,我有机会再看看它,并找出了解决这个问题的尴尬解决方案。

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

这意味着如果首先初始化发送器,它也会尝试在该端口上接收,因此它将获取所有传输的数据报。当接收器连接时,它从未接收到任何数据,仅仅是因为发射器正在使用它。