首先,您应该考虑过时的广播,特别是
INADDR_BROADCAST(255.255.255.255)。您的问题恰恰突出了广播不适合的原因之一。它应该与IPv4一起消失(希望如此)。请注意,IPv6甚至没有广播的概念(而是使用多播)。
INADDR_BROADCAST仅限于本地链接。如今,唯一可见的用途是用于DHCP自动配置,因为此时,客户端尚不知道客户端连接到哪个网络。
使用single时
sendto(),仅生成一个数据包,而传出接口由操作系统的路由表(
iproute在Linux上)确定。您不能一次
sendto()生成一个以上的数据包,您必须在所有接口上进行迭代,并使用原始套接字或将套接字绑定到用于
setsockopt(...,SOL_SOCKET, SO_BINDTODEVICE, "ethX")绕过OS路由表发送每个数据包的设备(这需要root特权) 。不是一个好的解决方案。
相反,由于
INADDR_BROADCAST无论如何都不路由,因此可以通过遍历每个接口并将数据包发送到其广播地址来实现几乎相同的目的。例如,假设您的网络具有255.255.255.0(/
24)掩码,则广播地址为 192.168.1.255 和 192.168.2.255
。给
sendto()这些地址中的每一个打电话一次,您就可以实现自己的目标。
编辑: 固定有关的信息
INADDR_BROADCAST,并以补充信息
SO_BINDTODEVICE。



