• C#网络唤醒


    什么是网络唤醒

    网络唤醒实现了对网络的集中管理,即在任何时刻,网管中心的IT管理人员可以经由网络远程唤醒一台处于休眠或关机状态的计算机。使用这一功能,IT管理人员可以在下班后,网络流量最小以及企业的正常运作最不受影响的时候完成所有操作系统及应用软件的升级及其他管理任务。

    为了唤醒网络上的计算机,用户必须发出一种数据包,该数据包的格式与普通数据包不同,而且还必须使用相应的专用软件才能产生。当前比较普遍采用的是AMD公司制作的Magic Packet,这套软件可以生成网络唤醒所需要的特殊数据包。该数据包包含有连续6个字节的“FF”和连续重复16次的MAC地址。Magic Packet 虽然只是AMD公司开发推广的一项技术,并非业界公认的标准,但是仍受到很多网卡制造商的支持,因此许多具有网络唤醒功能的网卡都能与之兼容。

    要使用网络唤醒,你必须拥有:

    1:可向网卡发送网络“唤醒帧”的软件。

    2:可解码“唤醒帧”的网卡,该网卡同时还必须可以从辅助电源中获取能量,并能够向主板发送“唤醒信号”。 (基本上都支持)

    先说被唤醒机器如何设置

    1.Win7系统下设置如下图,计算机-》设备管理器-》网卡驱动属性

    2.ipconfig –all 命令查看本机网卡的MAC地址

    发送的网络数据包显示如下图,其中mac地址是随便填写的重复的09。

     

    C#代码如下:

            private IPEndPoint point;
            private UdpClient client = new UdpClient();
            /**
             * 唤醒远程机器方法
             * @param
             * mac 要唤醒的机器的MAC
             * IP
             * port udp消息发送端口
             *
             * 摘要:唤醒方法为网卡提供的魔术封包功能,即以广播模式发送6个FF加上16遍目标MAC地址的字节数组
             **/
            private void wakeUp(string mac, int port, string ip)
            {
                byte[] magicBytes = getMagicPacket(mac);
                point = new IPEndPoint(IPAddress.Parse(ip), port);//广播模式:255.255.255.255
                try
                {
                    client.Send(magicBytes, magicBytes.Length, point);
                }
                catch (SocketException e) { MessageBox.Show(e.Message); }
            }
    
            /// <summary>
            /// 字符串转16进制字节数组
            /// </summary>
            /// <param name="hexString"></param>
            /// <returns></returns>
            public static byte[] strToHexByte(string hexString)
            {
                hexString = hexString.Replace(" ", "");
                if ((hexString.Length % 2) != 0)
                    hexString += " ";
                byte[] returnBytes = new byte[hexString.Length / 2];
                for (int i = 0; i < returnBytes.Length; i++)
                    returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16);
                return returnBytes;
            }
    
            /// <summary>
            /// 拼装MAC魔术封包
            /// </summary>
            /// <param name="hexString"></param>
            /// <returns></returns>
            public static byte[] getMagicPacket(string macString)
            {
                byte[] returnBytes = new byte[102];
                string commandString = "FFFFFFFFFFFF";
                for (int i = 0; i < 6; i++)
                    returnBytes[i] = Convert.ToByte(commandString.Substring(i * 2, 2), 16);
                byte[] macBytes = strToHexByte(macString);
                for (int i = 6; i < 102; i++)
                {
                    returnBytes[i] = macBytes[i % 6];
                }
                return returnBytes;
            }
    

    当然这只是在局域网中实现的,如果要在广域网中实现的话还需要路由器映射等什么的,本文不做讨论。

    AMD官方的技术文档:http://files.cnblogs.com/zxlovenet/MagicPacket%E7%99%BD%E7%9A%AE%E4%B9%A6.pdf

  • 相关阅读:
    技术学习博2
    正则匹配两个特定词组中间的内容的写法
    springboot mitre HTTP Proxy Servlet POST hang timeout 不执行的解决方案
    JAVA实现的HTTP反向代理 [smiley-http-proxy-servlet]学习
    get方式url传递map的写法,control传入map数据url格式&params[key]=value&params[key2]=value2
    angular7 学习笔记记录--1. TypeScript基础
    Operator '>' cannot be applied to types 'boolean' and 'number'?
    记录在linux环境redis如何重启版本5.x
    ElasticSearch (with docker )入门学习
    Dataway【实测】,让服务飞起来,让SpringBoot不再需要Controller、Service、DAO、Mapper
  • 原文地址:https://www.cnblogs.com/zxlovenet/p/3527222.html
Copyright © 2020-2023  润新知