问题 可以在同一台计算机上的多个应用程序接收UDP广播吗?


例如,假设我有一个“智能”温度计,每隔N秒将当前温度广播为UDP数据报。

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

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

这是:-

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

如果A或B,有什么办法围绕它。

如果C, 然后 我会发一些代码..


3677
2017-11-09 12:15


起源

您可以使用原始套接字,这通常允许您多次查看相同的数据包。但是你需要自己做一些解码(取决于平台UDP或IP + UDP甚至以太网+ IP + UDP)。 - KillianDS
@KillianDS-谢谢。希望这应该是直截了当的,因为我将使用Raw套接字取消广播.... - Roddy
可能重复 有多种方法可以让多个进程共享监听套接字? - feeling abused and harassed


答案:


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

SocketOptionName.ReuseAddress

选项(见这个答案 有多种方法可以让多个进程共享监听套接字?)。广播数据包应该强制Windows将该数据包的副本提供给该端点上的每个侦听器。

在回答Roddy时,是的,SO_REUSEADDR也在* nix上运行。

如需深入解答,请参阅 https://stackoverflow.com/a/14388707/705086


11
2017-11-09 12:35



令我惊讶的是,这似乎 - 主要是 - 工作。我认为当旧绑定卡在定时等待状态时,主要需要SO_REUSEADDR来重启TCP服务器。 - Roddy
SO_REUSEADDR在Unix / Linux上以这种方式工作吗? - Roddy
是否保证端点上的每个侦听器都会获得数据包的副本如果我有多个侦听器? - PaulK
UDP不是保证协议 - Mladen Mihajlovic
@PaulK我认为前面的答案让TCP / IP规范中使用的“可靠”与你所要求的混淆。同一台计算机上的每个侦听器应用程序应获得所接收UDP数据包的相同副本,无论其是否有错误。 - Jim