TearSnow Fan


使用Magic Packet进行网络唤醒(WOL)

现在几乎所有的电脑都支持从网络唤醒,这意味着你可以通过网络控制远程一台计算机开机。

目前,远程唤醒数据包的发送,大多使用AMD公司的Magic Packet。Magic Packet虽然只是AMD公司所开发的一项技术,但是受到了几乎所有网卡制造商的支持,因此,大多数流行网卡都能与之很好地兼容。最常使用的工具是Magic Packet Utility 1.00.005。

使用WOL需要被唤醒机满足以下条件:

  1. 使用ATX电源;
  2. 同时主板要提供对网络唤醒的硬件和软件支持(在BIOS中开启);
  3. 网卡支持WOL。

需要说明的是:如果是集成网卡,只要主板支持就行了;如果是PCI网卡,在主板上和网卡上会有三针的WOL跳线插座,需要将其连接好。

有些网卡还提供了对Wake up功能的设置项(例如集成在驱动的设置中),可以选择唤醒包的类型等。

发送Magic Packet唤醒数据包只需要知道被唤醒计算机网卡的MAC地址,这可以使用getmac命令,或者ipconfig命令结合all参数来实现。

使用Magic Packet Utility进行网络唤醒时,每次都必须输入手工被唤醒计算机的MAC地址,十分麻烦。还有一款名为WOL - Magic Packet Sender的软件,也使用Magic Packet包进行网络唤醒,但是功能更多,可以对配置文件进行管理。

Magic Packet的包格式很简单,首先是六个FF,然后是重复十六次待唤醒电脑的MAC。比如上图的封包,就应该是这样:

FF FF FF FF FF FF 20 12 04 24 13 43 20 12 04 24 13 43 ......

理论上可以在任意网络封包中打包Magic Packet,不过一般选择UDP或IPX。

下面使用C#语言编写了一个简单的小程序,使用UDP协议向局域网内广播Magic Packet包。

private static void WakeUp(byte[] mac)
{
    System.Net.Sockets.UdpClient client = new System.Net.Sockets.UdpClient();

    //指定目标地址为广播地址,端口号任意值即可;
    client.Connect(System.Net.IPAddress.Broadcast, 0);

    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];
        }
    }

    //发送UDP数据包,返回发送的字节数到bytesSent
    int bytesSent = client.Send(packet, packet.Length);

    if (bytesSent != packet.Length)
    {
        MessageBox.Show("发送可能失败,请重试!");
    }
}

该程序可以在博主的SkyDrive网盘下载。
最后讨论两个小问题:

一、跨局域网的问题

如果被唤醒机器和发送唤醒包的机器在同一个网段内,用client.Connect(IPAddress.Broadcast,port)是可以的。如果不是处于同一个网段内,那么就要用被唤醒机器网段的广播地址,比如A机器是192.168.1.2,B机器IP地址是192.168.11.10,用A远程唤醒B,就要用B网段的广播地址(192.168.11.255),即

IPAddress ip = new IPAddress(new byte[]{192,168,11,255});
client.Connect(ip,port)

前提是计算机A和计算机B的网络地址是可连通的。

二、从外网唤醒路由器内局域网中的机器

如果被唤醒的计算机位于使用NAT功能的路由器组建的局域网内,从外网上是看不到这台机器的,因此也无法将唤醒包送达被唤醒的计算机。

解决方法估计只有端口转发了,我觉得在路由器上设置将发到WAN地址为一个特定的UDP端口的数据包想LAN端广播即可,比如设定 UDP Port 9 至 LAN broadcast address,估计直接转发给被唤醒计算机的IP地址也没有问题。

引用:

[1] 利用Magic Packet启动电脑

[2] C# 远程唤醒(远程开机)

本文固定链接: http://blog.xieyc.com/wol-by-magic-packet/ | 小谢的小站

该日志由 xieyc 于2012年12月18日发表在 编程, 软件 分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
原创文章转载请注明: 使用Magic Packet进行网络唤醒(WOL) | 小谢的小站
关键字: , , ,

使用Magic Packet进行网络唤醒(WOL):等您坐沙发呢!

发表评论

:wink: :neutral: :mad: :twisted: :smile: :shock: :sad: :roll: :oops: :eek: :mrgreen: :lol: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!:

快捷键:Ctrl+Enter