【问题标题】:Can UDP broadcasts be received by multiple apps on the same computer?同一台计算机上的多个应用程序可以接收 UDP 广播吗?
【发布时间】:2012-10-29 18:18:38
【问题描述】:

例如,假设我有一个“智能”温度计,它每 N 秒以 UDP 数据报的形式广播当前温度。

现在,我可以编写一个客户端来侦听这些消息并以图形方式显示它们,并且我可以让该客户端同时在多台计算机上运行。目前没问题。

但是,当我尝试在同一台 Windows 计算机上运行客户端的两个实例时,我收到有关尝试“绑定到已使用的端口”的错误。

这是:-

  • 答:与所有操作系统上的 UDP 广播一样吗?
  • B:Windows 网络堆栈的限制?
  • C:或者,可能是我读取数据报的方式中的一个错误?

如果是A或B,有什么办法可以解决。

如果是 C,那么我会发布一些代码..

【问题讨论】:

  • 您可以使用原始套接字,这通常可以让您多次看到同一个数据包。但是您需要自己进行更多解码(取决于平台 UDP 或 IP+UDP 甚至以太网+IP+UDP)。
  • @KillianDS - 谢谢。希望这应该是直截了当的,因为我将只使用原始套接字来取消广播......

标签: networking tcp udp broadcast


【解决方案1】:

在 Windows 上,您可以使用以下方法将多个进程绑定到同一个套接字

SocketOptionName.ReuseAddress

选项(请参阅此答案Is there a way for multiple processes to share a listening socket?)。广播数据包应强制 Windows 将该数据包的副本提供给该端点上的每个侦听器。

回答 Roddy,是的,SO_REUSEADDR 在 *nix 上也是如此。

深入解答请参考https://stackoverflow.com/a/14388707/705086

【讨论】:

  • 令我惊讶的是,这似乎 - 主要 - 工作。我认为当旧绑定卡在定时等待状态时,主要需要 SO_REUSEADDR 来重新启动 TCP 服务器。
  • 如果我有多个监听器,是否保证端点上的每个监听器都会得到一个数据包的副本?
  • UDP 不是保证协议
  • @PaulK 我认为前面的答案将 TCP/IP 规范中使用的“可靠”与您所要求的混淆了。同一台计算机上的每个侦听器应用程序都应该获得接收到的 UDP 数据包的相同副本,无论它是否有错误。
猜你喜欢
  • 1970-01-01
  • 2014-02-12
  • 1970-01-01
  • 2010-10-15
  • 2011-12-24
  • 2011-12-03
  • 2013-08-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多