首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C# 實現 Wake-on-LAN 遠程喚醒:魔術封包構造、UDP 廣播與部署注意事項

     編輯:程式設計綜合問答

核心原理

Wake-on-LAN (WoL) 利用網卡在關機狀態下仍監聽特定「魔術封包」:6 字節 `0xFF` + 16 次重複目標 MAC 地址(共 102 字節),以 UDP 廣播發送至目標子網。

完整代碼解析

public static byte[] GetMagicPacket(string mac) {
    // 1. 解析 MAC "00-11-22-33-44-55" -> byte[6]
    byte[] macBytes = mac.Split('-', ':').Select(s => Convert.ToByte(s, 16)).ToArray();

    // 2. 組裝 102 字節封包
    byte[] packet = new byte[102];
    for (int i = 0; i < 6; i++) packet[i] = 0xFF;           // 同步流
    for (int i = 6; i < 102; i++) packet[i] = macBytes[(i - 6) % 6]; // 16 遍 MAC

    return packet;
}

public void WakeUp(string mac, string broadcastIp, int port = 9) {
    byte[] packet = GetMagicPacket(mac);
    using (UdpClient client = new UdpClient()) {
        client.EnableBroadcast = true; // 關鍵:允許廣播
        IPEndPoint ep = new IPEndPoint(IPAddress.Parse(broadcastIp), port);
        client.Send(packet, packet.Length, ep);
    }
}

關鍵參數說明

參數含義典型值
MAC目標機器網卡物理地址`00:11:22:33:44:55`
Broadcast IP目標子網廣播地址192.168.1.255(/24 網段)
PortUDP 端口,IANA 保留 9 (Discard) 或 7 (Echo),常用 99

部署必檢清單

  1. 目標機器 BIOS/UEFI:啟用 Wake on LAN / Power On by PCIe。
  2. 網卡驅動屬性:Wake on Magic Packet = Enabled,Wake on Pattern Match 可關閉。
  3. 電源管理:關閉「允許計算機關閉此設備以節省電源」,勾選「允許此設備喚醒計算機」。
  4. 路由器/交換機:允許廣播包轉發(部分設備默認阻擋),或配置端口映射至廣播地址。
  5. 防火牆:發送端開放 UDP 9 出站;接收端通常無需入站規則(網卡硬件處理)。
  6. 跨網段:需路由器配置 `ip directed-broadcast` 或部署 WoL 代理服務。

常見失敗排查

  • 發送端未 `EnableBroadcast = true` → 包不出網卡。
  • 廣播 IP 錯誤(如填寫網關 IP 而非子網廣播)。
  • MAC 地址大小寫、分隔符解析錯誤。
  • 目標機器未接網線、網卡無供電(部分筆記本關機斷電網卡)。

掌握上述細節,即可構建穩定可靠的遠程喚醒工具。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved