wake on lan 实现远程开机(远程开关机程序)

在上一篇文章“远程开关机程序”中讲了使用wake on lan 协议来实现开机功能。但没有说详细。

“wake on lan”是一个为现在大多数有线网卡所支持的一个功能,目前来说笔记本的无线网卡还不具备,主要是考虑到开启这个功能在关机的情况下仍会消耗一点电力,但随着低功耗硬件和高容量的电池的不断发展,让笔记本实现这个功能也是很容易的。

开启“wake on lan”功能需要在主板的bios里的电源选项里设置,记住开启该功能后即使在关机的情况下网卡仍会消耗一点电力。关机后的网卡会继续接受来着网络的数据包,当接收到开机指令时,便会启动计算机。那这条开机指令的格式是什么呢?

6*0xFF+16*MAC地址

重复六次0xFF和是六次要开机的网卡的mac地址。

一个0xFF是8位,一个mac地址是48位,6*8+16*48=816位 =102字节。

欲激活一台主机,那么就需要向该网卡发送102字节的数据包。如果使用c#的话就需要定义如下:

byte[] sendBytes = new byte[102];

无论激活哪台及其,数据包的前6字节都是一样的,都是0xFF。如果使用c#的话:

for (int i = 0; i < 6; i++)
           {
               sendBytes[i] = 0xFF;
           }

接下来就是填充mac地址了。我们在这里做个假设,目标机器的网卡mac为:

08-00-27-00-D8-9A

对输入的mac要处理一下

string macAddress=”08-00-27-00-D8-9A”;

macAddress = macAddress.Replace(":", "").Replace("-", "");

当然,需要将这个字符串处理一下,使之转化为byte类型,如果使用c#的话,可以使用 byte.Parse()方法将字符串转换为byte类型。例如:

byte test=byte.Parse(“FF”,System.Globalization.NumberStyles.HexNumber);

可以将字符串“FF"转为0b11111111。那么将上面的mac地址字符串转为byte字节数组,就是每次取两个字符串变为一个字节。

for (int i = 0; i < 16; i++)
            {
                for (int j = 0; j < 6; j++)
                {
                    sendBytes[(i + 1) * 6 + j] = byte.Parse(macAddress.Substring(j * 2, 2),    System.Globalization.NumberStyles.HexNumber);
                }
            }

由于要重复16次,所以在上一层多嵌套一个for循环。经过上述,一个102字节的开机数据包就准备好了。接下来就是要发送出去。

怎么发,使用UDP协议发送便可,发送到端口7或者端口9。发送到哪个地址,只要目标机器能收到便可,在局域网内一般以发送广播包的形式发送(255.255.255.255 为广播地址)。

UdpClient udpClient = new UdpClient();

udpClient.Send(sendBytes, sendBytes.Length, “255.255.255.255”, 7);

这样便完成了一个简单的远程开机功能。

对于发送的目标地址,我再说上两句。在局域网内发送广播包可以让网内的所有机器都收到给数据包。那么广域网能不能也实现开机这个功能呢?也是行的,只要保证能让目标主机的电脑接收到这个数据包就行了。假设你现在在外面,家里有台电脑,使用adsl宽带,电脑是连接路由的,路由再连接adsl拨号上网的。只要你路由没关,adsl没关,那么你就有一个ip地址,你在外网往这个ip地址发送数据,就会被路由收到(当然还到达不了你的机器),此时,你需要设置路由映射,让来自外网发送到路由端口7的数据转发到你的机器上,那么你的机器就能收到这个数据包了。

更多关于wake on lan的介绍还是得去看看专业文档。本代码已经在上一篇文章给出。

posted @ 2011-10-31 20:17 看那边的人 阅读(...) 评论(...) 编辑 收藏