仅从特定适配器(例如192.168.101.1)发送UDP广播(255.255.255.255);在Windows上

时间:2009-04-30 15:55:52

标签: c# windows udp broadcast

Windows XP或更高版本的解决方案。最好是C#或C ++。

我们不想使用子网定向广播(例如192.168.101.255)进行广播,因为我们尝试联系的设备没有响应。相反,我们希望能够仅从特定的NIC / IPAddress发送目标为255.255.255.255的UDP数据报,这样就不会在其他NIC上发送广播。

这意味着我们必须绕过IP堆栈,这就是问题所在。我们如何规避Windows上的IP堆栈以仅从特定的NIC / MAC地址发送符合UDP / IP的数据报?

4 个答案:

答案 0 :(得分:2)

将套接字绑定到所需的接口而不是使用INADDR_ANY?

// Make a UDP socket
SOCKET s = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
// Bind it to a particular interface
sockaddr_in name={0};
name.sin_family = AF_INET;
name.sin_addr.s_addr = inet_addr("192.168.101.3"); // whatever the ip address of the NIC is.
name.sin_port = htons(PORT);
bind(s,(sockaddr*)name);

答案 1 :(得分:2)

为了使用WinPcap在C#中发送原始数据包,您可以使用Pcap.Net。 它是用C ++ / CLI和C#编写的WinPcap的包装器,包括一个包解释和创建框架。

答案 2 :(得分:1)

我没试过这个,但我知道WinPCap允许你做一个原始的send。由于它工作在相当低的水平,它可能允许您在堆栈上发送足够低的频率以绕过完整的广播。那里有各种C#包装器,当然你可以使用那里提供的普通C / C ++代码。我认为诀窍可能是绑定到你要发送的正确的适配器,它可能会起作用。

答案 3 :(得分:0)

The broadcast address 255.255.255.255 is too general.您必须分别为每个网络接口制作不同的广播地址。