0

我正在用 C# 构建一个 Wake On Lan 程序,我找到了很多用于 WOL 的代码,但到目前为止我发现的任何东西都不起作用。我相信这是因为我无法启用 IP 定向广播(客户的安全策略不会启用此功能以防止 DOS 攻击)。

我正在寻找一种通过以太网将魔术数据包直接发送到请求的 MAC 地址的方法- 现在它似乎通过 UDP 发送到 255.255.255.255

(我不明白为什么它需要发送到 255.255.255.255 而不是 mac 本身)

这是我现在拥有的代码(不记得我在哪里找到的)。

public static bool WakeOnLan(string MacAddress)
{
    try
    {
        MacAddress = MacAddress.Replace("-", "");
        MacAddress = MacAddress.Replace(":", "");
        if (MacAddress.Length != 12)
        {
            return false;
        }
        byte[] mac = new byte[6];
        for (int k = 0; k < 6; k++)
        {
            mac[k] = Byte.Parse(MacAddress.Substring(k * 2, 2), System.Globalization.NumberStyles.HexNumber);
        }

        // WOL packet is sent over UDP 255.255.255.0:40000.
        System.Net.Sockets.UdpClient client = new System.Net.Sockets.UdpClient();
        client.Connect(System.Net.IPAddress.Broadcast, 4000);

        byte[] packet = new byte[17 * 6];

        for (int i = 0; i < 6; i++)
            packet[i] = 0xFF;

        for (int i = 1; i <= 16; i++)
            for (int j = 0; j < 6; j++)
                packet[i * 6 + j] = mac[j];

        client.Send(packet, packet.Length);
        return true;
    }
    catch
    {
        return false;
    }
}

任何帮助将不胜感激。

谢谢

4

1 回答 1

1

WoL 帧被发送到广播 MAC 地址ffff:ffff:ffff。为此,您必须将 IP 数据包发送到网络或受限广播地址。广播不会穿过路由器,因为这是一个巨大的安全漏洞。

必须从不同网络发送 WoL 的实现方法是在 LAN 上放置一个 WoL 服务器,并向 WoL 服务器发送命令,然后该服务器将在 LAN 上发送 WoL 帧。


编辑:

如果您尝试使用同一 LAN 上的源和目标进行 WoL,您可以使用 LAN 或有限广播,因为帧不会尝试通过路由器。

你真的不应该使用UDP。这可以通过以太网框架来完成。只需将帧发送到ffff:ffff:ffff. 仅需要 IP 地址才能将数据包从一个网络发送到另一个网络。LAN 上的数据以第 2 层(例如以太网、帧)的形式传送。

您可以只使用 的 EtherType 0x0842,然后在帧有效负载中,0xffffffffffff紧跟目标 MAC 地址的 16 次重复。这就是“魔术包”所必需的,因为它实际上是一个帧,而不是一个包。

于 2016-12-20T15:27:17.333 回答