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

15

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

现在,我可以编写一个客户端来监听这些消息并将其图形化显示,并且我可以让该客户端同时在多台计算机上运行。 到目前为止没有问题。

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

这是什么原因:

  • A:对于UDP广播,在所有操作系统上都是一样的吗?
  • B:是Windows网络堆栈的限制吗?
  • C:还是,可能是因为我读取数据报的方式存在错误?

如果是A或B,是否有任何解决方法。

如果是C,则我将发布一些代码。


1
你可以使用原始套接字,这通常允许你多次看到相同的数据包。但是你需要自己进行更多的解码(取决于平台,可能是UDP或IP+UDP甚至是以太网+IP+UDP)。 - KillianDS
@KillianDS - 谢谢。希望这应该很简单,因为我将只使用原始套接字来解开广播... - Roddy
可能是重复的问题:有没有办法让多个进程共享一个监听套接字? - user177800
1个回答

13

在Windows上,您可以通过使用“共享套接字”(shared socket)实现多个进程绑定到同一套接字。

SocketOptionName.ReuseAddress

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

回答Roddy,是的,在*nix上SO_REUSEADDR也是这样工作。

如需详细答案,请参阅https://dev59.com/rWYq5IYBdhLWcg3wjBQM#14388707


令我惊讶的是,这似乎 - 大多数情况下 - 能够正常工作。我认为 SO_REUSEADDR 主要用于在旧绑定处于超时等待状态时重新启动 TCP 服务器。 - Roddy
2
如果我有多个监听器,那么每个端点上的监听器都能保证收到数据包的副本吗? - PaulK
UDP不是一种可靠的协议。 - Mladen Mihajlovic
1
@PaulK 我认为之前的回答将TCP/IP规范中使用的“可靠”与您所问的内容混淆了。同一台计算机上的每个监听应用程序都应该收到接收到的UDP数据包的相同副本,无论其中是否有错误。 - Jim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接