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