天天看點

C# 遠端網絡喚醒介紹及代碼

一.定義

  網絡喚醒:喚醒休眠狀态下的計算機,而不是已關機的計算機。

  優勢:可通過定時功能實作自動喚醒計算機,減少人力使用。

  實作方法:通過被喚醒機的MAC位址進行廣播發送請求,喚醒計算機。

二.硬體設定

  1.Win7系統下設定如下圖,計算機-》裝置管理器-》網卡驅動屬性

C# 遠端網絡喚醒介紹及代碼

2.在BIOS設定允許網絡喚醒

   該功能設定介紹起來太墨迹,各位自行百度吧,很簡單...

二.上代碼

  技術提示:通過被喚醒機的MAC位址進行喚醒,格式為6遍“FF”+17遍mac的byte類型位元組。

  本來想先傳代碼,再進行一步一步講解的,但真是麻煩的不行,直接在代碼裡寫注釋了,各位自己看吧。源代碼在結尾處。

public partial class MainWindow : Window
    {
        //通過正規表達式設定MAC位址篩選标準,關于正規表達式請自行百度
        const string macCheckRegexString = @"^([0-9a-fA-F]{2})(([/\s:-][0-9a-fA-F]{2}){5})$";

        private static readonly Regex MacCheckRegex = new Regex(macCheckRegexString);


        public MainWindow()
        {
            InitializeComponent();
            
        }
        //喚醒主要邏輯方法
        public static bool WakeUp(string mac)
        {
            //檢視該MAC位址是否比對正規表達式定義,(mac,0)前一個參數是指mac位址,後一個是從指定位置開始查詢,0即從頭開始
            if (MacCheckRegex.IsMatch(mac, 0))
            {
                byte[] macByte = FormatMac(mac);
                WakeUpCore(macByte);
                return true;
            }

            return false;

        }

        private static void WakeUpCore(byte[] mac)
        {
            //發送方法是通過UDP
            UdpClient client = new UdpClient();
            //Broadcast内容為:255,255,255,255.廣播形式,是以不需要IP
            client.Connect(System.Net.IPAddress.Broadcast, 50000);
            //下方為發送内容的編制,6遍“FF”+17遍mac的byte類型位元組。
            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];
            //喚醒動作
            int result = client.Send(packet, packet.Length);
        }

        private static byte[] FormatMac(string macInput)
        {
            byte[] mac = new byte[6];

            string str = macInput;
            //消除MAC位址中的“-”符号
            string[] sArray = str.Split(\'-\');


           //mac位址從string轉換成byte
            for (var i = 0; i < 6; i++)
            {
                var byteValue = Convert.ToByte(sArray[i], 16);
                mac[i] = byteValue;
            }

            return mac;
        }

        private void Button_Click_1(object sender, RoutedEventArgs e)
        {
            WakeUp("00-01-80-7E-C3-D2");
        }
    }      

三.代碼上傳