“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的数据转发到你的机器上,那么你的机器就能收到这个数据包了。