首页 > 技术文章 > C#远程开机

fer-team 2017-12-07 17:55 原文

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

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

今天说的就是如何用C#程序来远程唤醒局域网中的计算机,

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

1:可向网卡发送网络“唤醒帧”的软件。
2:可解码“唤醒帧”的网卡,该网卡同时还必须可以从辅助电源中获取能量,并能够向主板发送“唤醒信号”。

先说被唤醒机器如何设置
必须将被唤醒计算机BIOS中“Wake On LAN”或者“Resume by LAN”选项必须设置为“Enable”。
必须获取到被唤醒计算机网卡MAC

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)
{
    byte[] magicBytes =StrUtility.getMagicPacket(mac);
    point = new IPEndPoint(IPAddress.Parse("255.255.255.255"),port);//广播模式:255.255.255.255
           
try
{
               
client.Send(magicBytes, magicBytes.Length,point);
}
catch (SocketException) { }
       
}
StrUtility.getMagicPacket代码如下

///<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;
}

 

推荐阅读