首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# 實現網路喚醒:Magic Packet 封裝與 UDP 廣播發送完整代碼

     編輯:關於C#

**Wake-on-LAN (WoL)** 讓管理員遠程喚醒休眠/關機電腦,核心是發送 **Magic Packet**:6 字節 0xFF + 16 次重複目標 MAC 位址(共 102 字節)。本文提供完整 C# 實現,含 MAC 解析、封包組裝、UDP 廣播發送。

前置條件

  1. 目標主機網卡支援 WoL 且 BIOS/驅動程式已啟用(Windows 10/11:裝置管理員 → 網卡屬性 → 電源管理/進階 → 啟用「Magic Packet 喚醒」)。
  2. 取得目標 MAC:ipconfig /all 查看「實體位址」。
  3. 同區域網路(廣播封包不跨路由器;跨網段需路由器配置 UDP 轉發/子網廣播)。

核心代碼

using System;
using System.Net;
using System.Net.Sockets;
using System.Windows.Forms;

public class WakeOnLan {
    private readonly UdpClient _udp = new UdpClient();
    private IPEndPoint _ep;

    /// 
    /// 發送喚醒封包
    /// 
    /// 目標 MAC (格式: "00-11-22-33-44-55" 或 "001122334455")
    /// UDP 埠 (通常 7 或 9)
    /// 廣播位址 (預設 255.255.255.255)
    public void WakeUp(string mac, int port = 7, string broadcastIp = "255.255.255.255") {
        byte[] packet = BuildMagicPacket(mac);
        _ep = new IPEndPoint(IPAddress.Parse(broadcastIp), port);
        try {
            _udp.Send(packet, packet.Length, _ep);
            MessageBox.Show("Magic Packet 已發送", "完成");
        } catch (SocketException ex) {
            MessageBox.Show($"發送失敗: {ex.Message}", "錯誤");
        }
    }

    /// 
    /// 組裝 Magic Packet: 6xFF + 16xMAC
    /// 
    private static byte[] BuildMagicPacket(string mac) {
        byte[] macBytes = ParseMac(mac);
        byte[] packet = new byte[102];
        // 前 6 字節 0xFF
        for (int i = 0; i < 6; i++) packet[i] = 0xFF;
        // 後 96 字節: 16 次 MAC
        for (int i = 6; i < 102; i++) packet[i] = macBytes[i % 6];
        return packet;
    }

    /// 
    /// 解析 MAC 字串為 6 字節陣列
    /// 
    private static byte[] ParseMac(string mac) {
        mac = mac.Replace("-", "").Replace(":", "").Replace(" ", "");
        if (mac.Length != 12) throw new ArgumentException("MAC 格式錯誤");
        byte[] bytes = new byte[6];
        for (int i = 0; i < 6; i++)
            bytes[i] = Convert.ToByte(mac.Substring(i * 2, 2), 16);
        return bytes;
    }
}

使用範例

var wol = new WakeOnLan();
wol.WakeUp("00-11-22-33-44-55", 9);  // 埠 9 (Discard) 或 7 (Echo)

關鍵細節

  • UdpClient 預設不啟用廣播,**需設置** _udp.EnableBroadcast = true(或在建構子指定 new UdpClient { EnableBroadcast = true })。
  • 目標機器防火牆需允許 UDP 埠 7/9 入站。
  • 封包格式遵循 AMD Magic Packet 標準,主流網卡(Realtek、Intel、Broadcom)皆相容。
  • 僅限**同一廣播域**;跨 VLAN/路由需配置 ip directed-broadcast 或 WoL 代理。

驗證截圖

網卡WoL啟用設置 封包發送示意

幾十行代碼即可賦予應用遠程喚醒能力,適合 IT 自動化運維、排程備份喚醒、智慧家居整合等場景。

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