使用C#发送幻数据包(Magic Pack)远程唤醒计算机
2015-10-30 Shane Jhu
本文主要介绍使用 C# 发送幻数据包(Magic Pack)的方法,在主板、网卡中进行相应设置后,即可对处于睡眠和休眠状态的远程计算机进行唤醒。
封装及发送数据包核心类:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Net.Sockets; using System.Net; /// <summary> ///WakeOnLine 的摘要说明 /// </summary> public class WakeOnLine { public WakeOnLine() { // //TODO: 在此处添加构造函数逻辑 // } private IPEndPoint point; private UdpClient client = new UdpClient(); /** * 唤醒远程机器方法 * @param * mac 要唤醒的机器的MAC * IP * port udp消息发送端口 * * 摘要:唤醒方法为网卡提供的魔术封包功能,即以广播模式发送6个FF加上16遍目标MAC地址的字节数组 **/ public int wakeUp(string mac, int port, string ip) { byte[] magicBytes = getMagicPacket(mac); point = new IPEndPoint(GetOrCheckIP(ip), port);//广播模式:255.255.255.255 try { return client.Send(magicBytes, magicBytes.Length, point); } catch (SocketException e) { /*MessageBox.Show(e.Message);*/ } return -100; } /// <summary> /// 字符串转16进制字节数组 /// </summary> /// <param name="hexString"></param> /// <returns></returns> private 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> private 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; } /// <summary> /// 域名解析 /// </summary> /// <param name="hexString"></param> /// <returns></returns> public IPAddress GetOrCheckIP(string HostOrIP) { IPAddress IPA; if (!IPAddress.TryParse(HostOrIP, out IPA)) { //IPHostEntry host = Dns.GetHostByName(HostOrIP); IPHostEntry host = Dns.GetHostEntry(HostOrIP); IPA = host.AddressList[0]; } return IPA; } }
调用方法:
string Mac = "D027000014"; //MAC地址,注意此处没有中间的“-” string Ip = "xulavigne.mydomain.net"; //IP或域名 string SubnetMask = "255.255.255.255"; //默认 int Port = 2304; //默认端口或计算机在路由器中的映射端口 WakeOnLine WOL = new WakeOnLine(); int i = WOL.wakeUp(Mac, Port, Ip);
成功发送数据包后,处于睡眠或休眠状态的计算机就会被唤醒。
不过我的Acer RL80用的有线连接,在睡眠和休眠下唤醒正常,但无法在关机状态下唤醒,在主板中没找到相应设置。
在最新的Windows 10中(可能与Windows版本无关,之前版本的Windows中应该也有设置,没留意过),也许是使用的最新的网卡驱动,有线网卡中可以设置开启“关机网络唤醒”,甚至2010年的老笔记本也支持关机唤醒了,实测有效,见下图:
本文由lenashane.com原创,转载请注明出处:查看原文
如果觉得文章还不错,请点个赞吧