在 Windows 7 上发送 UDP 广播

Posted

技术标签:

【中文标题】在 Windows 7 上发送 UDP 广播【英文标题】:Send UDP broadcast on Windows 7 【发布时间】:2010-07-12 14:08:56 【问题描述】:

我的 PC 有两个网卡连接到不同的网络(多宿主网络设置)。我想在两个网络上发送 UDP 广播帧。帧的发送者 IP 地址必须是用于发送帧的适配器的 IP 地址。目标地址应该是 LIMITED BROADCAST 地址。

客户应用程序不应以管理权限运行(不接受 UAC)。

如何将这些 UDP 帧发送到 LIMITED BROADCAST 地址 (255.255.255.255)? 如何将这些帧发送到 NETWORK BROADCAST 地址 (x.y.z.255)?

我知道如何使用原始套接字来做到这一点。但原始套接字只能用于管理权限。

【问题讨论】:

【参考方案1】:

你不能只打开两个普通的 UDP 套接字并将一个绑定到每个接口地址,然后简单地发送到广播地址吗?

据我所知,这将处理两个网络上的发送,它将确保发送的数据包具有正确的 IP 地址。如果将单个套接字绑定到 INADDR_ANY 它将不起作用,当然,如果机器中只有一个网络适配器,它将起作用。要创建一个完整的解决方案,最好迭代可用地址并为每个地址创建一个套接字,绑定到每个地址并从每个地址发送。

【讨论】:

没有。绑定套接字会影响此套接字接受哪些接收到的数据包。发送的数据包根据 IP 路由规则进行路由。我可以迭代适配器和绑定到这些适配器的 IP 地址,并为每个 IP 地址发送一个网络广播。但这不会发送到 LIMITED BROADCAST 地址。 你确定吗?当您发出 SendTo 时,套接字隐式绑定到用于发送的本地套接字,以便接收者可以回复。您可以看到这一点,因为您无法在没有绑定或之前在套接字上发送的情况下执行 RecvFrom ... 如果您有两个接口都可以路由到同一个目的地,那么如果您没有绑定,操作系统会选择一个。您可以在发出 SendTo 之前绑定以选择本地地址。 啊,我明白了。你是对的!在 Windows 7 中,bind() 调用会影响帧的接收和传输。这与 Windows XP 行为不同,在 Windows XP 行为中,帧已使用任意适配器地址发送到所有适配器。您需要 Windows XP 的 RAW 套接字来发送适当的源地址。但是 Windows 7 将 LIMITED BROADCASTS 发送到套接字绑定到的适配器。非常感谢,哈珀

以上是关于在 Windows 7 上发送 UDP 广播的主要内容,如果未能解决你的问题,请参考以下文章

Win 10 应用开发UDP广播

Linux 上 C 中的 UDP 发送方和 Windows 上 Qt 中的接收方不起作用? [关闭]

无法在 iOS 设备上发送 UDP 广播 - NWConnection

VB6 应用程序通过 winsock 发送 UDP 广播消息 - 仅每秒发送一次消息

win7如何设允许udp组播

Android 使用udp发送广播