目前,远程唤醒数据包的发送,大多使用AMD公司的Magic Packet。Magic Packet虽然只是AMD公司所开发的一项技术,但是受到了几乎所有网卡制造商的支持,所以,几乎所有流行网卡都能与之很不错地兼容。最常使用的工具是Magic Packet Utility 1.00.005。
使用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包。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
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("发送可能失败,请重试!");
}
}
|
最后讨论两个小问题:
一、跨局域网的问题
如果被唤醒机器和发送唤醒包的机器在同一个网段内,用client.Connect(IPAddress.Broadcast,port)是可以的。如果不是处于同一个网段内,那么就要用被唤醒机器网段的广播地址,比如A机器是192.168.1.2,B机器IP地址是192.168.11.10,用A远程唤醒B,就要用B网段的广播地址(192.168.11.255),即
1
2
|
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地址也没有问题。
好了,以上就是全部内容了。