lena和shane,家庭日志,xulavigne,Lena&Shane

使用C#发送幻数据包(Magic Pack)远程唤醒计算机

发布时间:2015-10-30 编辑:Shane Jhu 阅读 ()

本文主要介绍使用 C# 发送幻数据包(Magic Pack)的方法,在主板、网卡中进行相应设置后,即可对处于睡眠和休眠状态的远程计算机进行唤醒。

TM截图未命名.png

封装及发送数据包核心类:

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年的老笔记本也支持关机唤醒了,实测有效,见下图:

2016-10-27.png


2016-10-27 (1).png

本文由lenashane.com原创,转载请注明出处:查看原文

如果觉得文章还不错,欢迎打赏

9月 1 2019
生活的艺术在于把握好每一次的让步和坚持。

亨利·艾利斯 (Henry Ellis)