代码之家  ›  专栏  ›  技术社区  ›  Jason Williams

.NET中的双向/环回UDP

  •  1
  • Jason Williams  · 技术社区  · 14 年前

    我有一个应用程序需要在同一个端口上发送和接收。这有两种情况:

    • PC与远程硬件对话的地方。它“回复发件人”,所以数据报通过发送端口返回到我的电脑。

    • PC正在与自己对话(环回模式)进行测试和演示(测试应用程序通过UDP向我们的主应用程序提供假数据)。

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

    是否有人能通过建议“正确”的方法来实现UDPClient以可靠地处理上述情况来缩小搜索范围?

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

    编辑

    详述:

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

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

    所以我有两个问题:

    1)如何可靠地管理环回。

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

    由于我尝试了1或2个udpclient和多种不同设置的各种组合(但没有效果),我只是想知道是否有人成功地使upd环回工作良好,因为这可能会给我一个解决方案,我可以在所有情况下工作。

    谢谢你花时间考虑这件事…

    3 回复  |  直到 13 年前
        1
  •  3
  •   Chris Taylor    14 年前

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

    你有

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

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

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

    我抓住了你的本质了吗?

    如果是,您是否考虑向机器添加第二个IP地址?这确实 意味着你需要两张网卡,一张网卡可以有多个IP地址。这样,您就可以将两个“设备”放在一个单独的接口上,这样就可以克服在同一个接口上同时存在这两个设备的任何冲突。

    例如,如果您有两个IP地址 192.168.0.5 192.168.0.6 .

    客户端应用程序可以发送到 192.1680.6 接收时间 192.1680.5 当硬件仿真器接收到 192.1680.6 并回应 192.1680.5 .

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

    这适用于2000/XP/2003,但Vista和Windows7的过程类似。

        2
  •  5
  •   Sachin Chavan    14 年前

    这是按设计的。

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

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

    例子:

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

    UDP就像调频广播。不管是否有人在另一端收听,收音机都会播放一首歌。如果接收器打开了收音机,他们就会收到这首歌。如果歌曲在10:30发送,而我的收音机在10:30打开,我就能听到这首歌。但如果我在10点35分发动袭击,那就意味着我错过了,再也听不到了。

    更新

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

    同样,我可以建议两种解决方法(不是很好,但可行)。

    1. 如你所说,如果你在启动接收器后启动发射器,一切都会好起来的。所以,试着把定期重启发射器的逻辑放进去。

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

        3
  •  0
  •   Jason Williams    13 年前

    离开这段代码很长一段时间后,我有机会再次查看它,并为这个问题找到了令人尴尬的微不足道的解决方案。

    结果是,调用我的UDP类的客户机代码将其设置为同时发送和接收。因此,我没有使用具有写访问权限的发送器和具有读访问权限的接收器,而是使用具有读/写权限的发送器和具有读/写权限的接收器。

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