WOL的主要原理是向目标主机的网卡上发送一个特定结构的UDP包,如果目前网卡以及操作系统支持,则可以实现网络唤醒主机。
这个数据包的结构定义如下:
- 头部为6个0xFF。
- 后面跟着16次目标网卡MAC地址的重复。
总共102 Bytes的数据包。
具体细节可以参考Wikipedia:
https://en.wikipedia.org/wiki/Wake-on-LAN
下面是一个用TypeScript + NodeJS实现的网络唤醒程序。
import * as dgram from "dgram";
//TypeScript
var $socket: dgram.Socket = null;
var $magicPacket: Buffer;
//构建魔数包
function makeMagicPacket(mac: string): Buffer {
let hex: string = "ffffffffffff";
let result: Buffer;
//重复16次mac地址
hex += mac;
hex += mac;
hex += mac;
hex += mac;
hex += mac;
hex += mac;
hex += mac;
hex += mac;
hex += mac;
hex += mac;
hex += mac;
hex += mac;
hex += mac;
hex += mac;
hex += mac;
hex += mac;
result = new Buffer(hex, "hex");
return result;
}
function initSocket() {
try {
//构建魔数包 "224466881234" 为目标主机的活动网卡MAC地址
$magicPacket = makeMagicPacket("224466881234");
//创建UDP
$socket = dgram.createSocket("udp4");
if ($socket) {
$socket.on("listening", () => {
//启用广播
$socket.setBroadcast(true);
//广播魔数包
$socket.send($magicPacket, 9, "255.255.255.255");
});
$socket.bind(0);
}
} catch (err) {
console.error(err);
}
}
function main() {
initSocket();
}
main();