欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

c#网络唤醒功能实现

程序员文章站 2024-02-25 19:04:39
网络唤醒实现了对网络的集中管理,即在任何时刻,网管中心的it管理人员可以经由网络远程唤醒一台处于休眠或关机状态的计算机。使用这一功能,it管理人员可以在下班后,网络流量最小...

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

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

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

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

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

先说被唤醒机器如何设置
1.win7系统下设置如下图,计算机-》设备管理器-》网卡驱动属性

c#网络唤醒功能实现

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

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

c#网络唤醒功能实现

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