程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> 關於C# >> C#中使用網絡喚醒

C#中使用網絡喚醒

編輯:關於C#

什麼是網絡喚醒

網絡喚醒實現了對網絡的集中管理,即在任何時刻,網管中心的IT管理人員可以經由網絡遠程喚醒 一台處於休眠或關機狀態的計算機。使用這一功能,IT管理人員可以在下班後,網絡流量最小以及企業 的正常運作最不受影響的時候完成所有操作系統及應用軟件的升級及其他管理任務。

為了喚醒網絡上的計算機,用戶必須發出一種數據包,該數據包的格式與普通數據包不同,而且還 必須使用相應的專用軟件才能產生。當前比較普遍采用的是AMD公司制作的Magic Packet,這套軟件可 以生成網絡喚醒所需要的特殊數據包。該數據包包含有連續6個字節的“FF”和連續重復16 次的MAC地址。Magic Packet 雖然只是AMD公司開發推廣的一項技術,並非業界公認的標准,但是仍受 到很多網卡制造商的支持,因此許多具有網絡喚醒功能的網卡都能與之兼容。

要使用網絡喚醒,你必須擁有:

1:可向網卡發送網絡“喚醒幀”的軟件。

2:可解碼“喚醒幀”的網卡,該網卡同時還必須可以從輔助電源中獲取能量,並能夠向 主板發送“喚醒信號”。 (基本上都支持)

先說被喚醒機器如何設置

1.Win7系統下設置如下圖,計算機-》設備管理器-》網卡驅動屬性

2.ipconfig –all 命令查看本機網卡的MAC地址

發送的網絡數據包顯示如下圖,其中mac地址是隨便填寫的重復的09。

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

當然這只是在局域網中實現的,如果要在廣域網中實現的話還需要路由器映射等什麼的,本文不做 討論。

查看本欄目

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved