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();