C# 远程开机,关闭简单案例

版权声明:本文为博主原创文章,未经博主允许不得转载。http://blog.csdn.net/taoerit https://blog.csdn.net/taoerit/article/details/83538863

    最近有个需求,就是远程开机,网上搜了些方法,我选用的是网卡开机,也就是通过发送广播包唤醒电脑

  网卡唤醒要求:

     1  发送广播包: 6个“FF"+16个目标主机网卡地址

       广播发送bys数据即可

  

     2 BIOS要设置LAN唤醒

       有的需要设置本地连接的唤醒,其实基本不用设置,默认是开启的,主要是在bios里开启

了解网卡唤醒要求后,就可以写代码了

   2 主要代码

  public static void WakeUp(string macString)
        {
            try
            {
                if (macString.Split('-').Length == 6)
                {
                    string macStr = macString.Replace('-',' ');;

                    byte[] macByteArray = HexStringSToByteArray(macStr);
                 
                    UdpClient client = new UdpClient();
                    client.Connect(IPAddress.Broadcast, 1234);

                    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 ii = 0; ii < 6; ii++)
                        {
                            packet[i * 6 + ii] = macByteArray[ii];
                        } 
                    }

                    client.Send(packet, packet.Length);  
                }
            }
            catch (Exception ex)
            {
               // MessageBox.Show("网络唤醒失败:" + ex.StackTrace + " \r\n" + ex.Message);
            }
        }

3 字符串转换


        /// <summary>
        /// 2位16进制转int
        /// </summary>
        /// <param name="hex"></param>
        /// <returns></returns>
        public static int HexStringToInt(string hex)
        {
            int num1 = 0;
            int num2 = 0;
            char[] nums = hex.ToCharArray();
            if (hex.Length == 2)
            {
                for (int i = 0; i < nums.Length; i++)
                {
                    String strNum = nums[i].ToString().ToUpper();
                    switch (strNum)
                    {
                        case "A":
                            strNum = "10";
                            break;
                        case "B":
                            strNum = "11";
                            break;
                        case "C":
                            strNum = "12";
                            break;
                        case "D":
                            strNum = "13";
                            break;
                        case "E":
                            strNum = "14";
                            break;
                        case "F":
                            strNum = "15";
                            break;
                        default:

                            break;
                    }
                    if (i == 0)
                    {
                        num1 = int.Parse(strNum) * 16;
                    }
                    if (i == 1)
                    {
                        num2 = int.Parse(strNum);
                    }
                }
            }

            return num1 + num2;
        }


        /// <summary>
        /// 16进制字符串转byte[] 48 65 6C 6C 6F 20 57 6F 72 6C 64 21
        /// </summary>
        /// <param name="hexValues"></param>
        /// <returns></returns>
        public static byte[] HexStringSToByteArray(string hexValues)
        {

            string[] hexValuesSplit = hexValues.Split(' ');
            byte[] val = new byte[hexValuesSplit.Length];
            int i = 0;
            foreach (string hex in hexValuesSplit)
            {
                int value = HexStringToInt(hex);
                val[i] = (byte)value;
                i++;
            }

            return val;
        }

  4 调用方法

WakeUp("F0-79-59-68-36-49");

 5 远程关闭

    可用Socket通讯,发送指令,然后调用下面指令代码,可以关机


        /// <summary>
        /// 关闭系统
        /// </summary>
        /// <param name="time"></param>
        public static void CloseSystem(int time)
        {
            ProcessStartInfo ps = new ProcessStartInfo();
            ps.FileName = "shutdown.exe";
            ps.Arguments = "-s -t " + time;// -s -t 00
            Process.Start(ps);
        }

        /// <summary>
        /// 重启系统
        /// </summary>
        /// <param name="time"></param>
        public static void ReSystem(int time)
        {
            ProcessStartInfo ps = new ProcessStartInfo();
            ps.FileName = "shutdown.exe";
            ps.Arguments = "-r -t " + time;// -r -t 00
            Process.Start(ps);
        }

6 测试

   这一步很重要,如果你发广播自己都没收到,那就是有问题了,我也遇到了收不到的情况,最后的原因是自己的电脑有虚拟网卡,没有关闭掉,关掉就好了

猜你喜欢

转载自blog.csdn.net/taoerit/article/details/83538863
今日推荐