TimeFlies

我还以为今天是二号,二号已经变成昨天,如今已是七月,想起去年七月发生的事情好像刚过去不久,元旦的时候总会说说新年新开始,如今一年过半了也不知道驶到哪里了。时间的步子很匆忙而我又太懒惰。

Wake On LAN 网卡激活远程开机

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

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

向需要开机的的主机的子网发送一个广播包,包的内容为:6个“FF”+16个目标主机网卡地址。60xFF+16MAC地址,例如目标主机的mac地址是“00010203040506”,那么这个包的内容就是:

FFFFFFFFFFFF00010203040506000102030405060001020304050600010203040506000102030405060001020304050600010203040506000102030405060001020304050600010203040506000102030405060001020304050600010203040506000102030405060001020304050600010203040506

将以上数据以udp方法发送到7或者9端口上。这样便实现了远程开机功能。

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

一个0xFF是8位,一个mac地址是48位,68+1648=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的介绍还是得去看看专业文档。