2

适用于 Windows XP 或更高版本的解决方案。最好在 C# 或 C++ 中。

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

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

4

4 回答 4

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);
于 2009-05-07T14:11:24.960 回答
2

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

于 2010-04-19T14:34:25.640 回答
1

我没有尝试过,但我知道 WinPCap 允许您进行原始发送。由于它在相当低的级别上工作,它可能允许您在堆栈上发送足够低的数据以绕过完整的广播。那里有各种 C# 包装器,当然您可以使用那里可用的普通 C/C++ 代码。我认为诀窍可能是绑定到您想要发送出去的正确适配器,它可能会正常工作。

于 2009-05-07T17:43:31.987 回答
0

广播地址 255.255.255.255 太笼统了。您必须分别为每个网络接口制作不同的广播地址。

于 2010-02-05T19:33:52.507 回答