c#网络唤醒功能实现

时间:2022-07-03 03:26:51 

网络唤醒实现了对网络的集中管理,即在任何时刻,网管中心的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;
}

标签:网络唤醒
0
投稿

猜你喜欢

  • 关于synchronized有趣的同步问题

    2021-11-03 05:46:55
  • Spring Boot 整合持久层之Spring Data JPA

    2022-07-29 04:00:38
  • c#.net 常用函数和方法集

    2022-08-03 01:44:00
  • JAVA熔断和降级真实关系的图文详解

    2023-11-30 12:39:20
  • Java String、StringBuffer与StringBuilder的区别

    2022-08-29 23:29:55
  • Java对象级别与类级别的同步锁synchronized语法示例

    2023-06-25 09:11:22
  • 一篇文章带你从java字节码层理解i++和++i

    2023-05-29 13:57:58
  • java8 利用reduce实现将列表中的多个元素的属性求和并返回操作

    2021-09-29 06:53:38
  • 解决Springboot get请求是参数过长的情况

    2023-11-27 16:45:37
  • 这一次搞懂Spring事务是如何传播的

    2022-12-27 07:06:53
  • Java 超详细图解集合框架的数据结构

    2022-04-14 13:09:00
  • J2ee 高并发情况下监听器实例详解

    2022-12-26 05:47:43
  • Java实现json数据处理的常用脚本分享

    2022-07-27 15:21:39
  • Java Thread 类和Runnable 接口详解

    2023-11-10 20:16:00
  • java前后端加密解密crypto-js的实现

    2023-11-29 12:09:31
  • Java设计模式之观察者模式(Observer模式)介绍

    2022-10-16 04:40:42
  • Java集合继承体系详解

    2023-12-03 00:22:13
  • springboot添加https服务器的方法

    2022-08-19 06:14:31
  • Java创建树形结构算法实例代码

    2021-11-21 22:24:01
  • Java实现在线SQL编程最新完整版

    2022-04-12 01:03:45
  • asp之家 软件编程 m.aspxhome.com