网络冷开机,高手进啊!(200分)

  • 主题发起人 主题发起人 hjlover2000
  • 开始时间 开始时间
H

hjlover2000

Unregistered / Unconfirmed
GUEST, unregistred user!
要求在其他计算机关闭的情况下,使用程序远程开机。我的打算是:在网卡支持网络开机的前提下,查找其网卡的MAC,发送数据包,启动机器。
请问各位老大这一方案是否可行?如何实现??
 
要主版支持幻醒功能
好象bx以上的可以
 
恩,我就是这个意思,问题是接下来如何实现???
 
网卡上需要插个ROOM,ATX电源需要插着,去找找无盘站的资料就知道了。
 
ROM不是ROOM不好意思。
 
不好意思啊,我的意思是如何用程序实现。只要对指定的MAC发送数据包就可以了,问题是如果他的机器没有开机,也支持唤醒,我如何用程序实现远程开机。谢谢
 
这分也太好拿了吧。建议楼主问问题前先查一下离线数据库。下面是copy来的:

很简单:在udp包中加入以6个FF为先导,后面跟需唤醒的网卡的相应MAC地址重复16次即可
procedure TForm1.Button1Click(Sender: TObject);
var
SendCode:string;
TempStr:string;
i:byte;
begin
SendCode:=StringofChar(#255,6); //FF*6
for i:=0 to 15 do
begin
TempStr:=TempStr //TempStr:=DestMAC*16
+string(char($00))
+string(char($50))
+string(char($BA))
+string(char($EC))
+string(char($71))
+string(char($A6));
end;
SendCode:=SendCode+TempStr;//SendCode:=FF*6+DestMAC*16
UDPSend(SendCode);
end;
procedure TForm1.UDPSend(SendCode: String);
var
SendMStream:TMemoryStream;
begin
SendMStream:=TMemoryStream.Create;
try
NMUDP1.ReportLevel:=1;
NMUDP1.RemoteHost:='188.0.255.255';
NMUDP1.RemotePort:=7010;
SendMStream.Write(SendCode[1],length(SendCode));
NMUDP1.SendStream(SendMStream);
finally
SendMStream.Free;
end;
end;

AMD的方法就是我说的前一种,通过MAC地址来控制的,
包的格式很简单,在以太网包的任何位置上,
以6个FF为先导,后面跟相应MAC地址重复16次即可:

FF FF FF FF FF FF 08 65 88 a0 00 38 ... ... 08 65 88 a0 00 38
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
重复16次

当然,网卡必须支持这种协议,主板/电源也必须支持网络唤醒

技术秘密?你竟然认为这是技术秘密?怪不得...
这项标准是AMD公司提出的,任何一个公司提出一项标准,都希望更多的人接受和使用它,
如果你愿意,他还会提供给你全部的样例源代码用于使用这项技术。
你见过那个公司不是这样吗?因此这绝不是什么技术秘密。

另一方面,我上面说的你试验过了吗?没有试验,就主观认为不行,不太合适吧?
你既然要用心眼看这个世界,就不要被肉眼见到的东西所蒙蔽哟!
 
淺談 Wake On Lan

作者:北縣教網張啟中


資料來源:http://enews.tpc.edu.tw/document/technology/2001/%E6%95%99%E7%B6%B2%E4%B8%AD%E5%BF%83%E5%BC%B5%E5%95%9F%E4%B8%AD%E3%80%8C%E6%B7%BA%E8%AB%87%20Wake%20On%20Lan%E3%80%8D.htm

遠端喚醒(Wake On Lan,WOL)是許多網管人員喜歡使用的功能之一。有了遠端喚醒,對於不需要24小時開機運作的機器,可以在需要的時候,直接從遠端透過網路將其開機,然後進行維護,兼顧了省電與維護便利的需求。這篇文章將簡單的探討一下有關遠端喚醒功能的實作方式及其原理,程式部分,則以 C++ Builder 5.0(Enterprise 版本)為主,讀者在瞭解原理後,可以改以自己熟悉的語言來撰寫。


先談談遠端喚醒功能,所需具備的硬體條件:

(1)主機板必須支援 Wake On Lan 的功能。通常有支援的主機板,它必定會有一個接口,以連接到網路卡,記得,如果你的主機板有支援 WOL 的功能的話,在BIOS的設定中,你得將這個功能選項打開,這項功能通常在 Power Management 的選單中。

(2)你的網路卡必須支援Wake On LAN,這樣的網路卡比起一般的網路卡稍貴,但大約在 500-600元間,安裝時,記得要將連接線連接到主機版,否則,網路卡可是無法將開機訊號通知主機版的。


當硬體環境符合以上條件,那麼只需有一個遠端喚醒的程式,就可以達到遠端喚醒的功能了。在 AMD的網站中有提供一個程式,叫 Magic Package,它可以讓你設定時間,喚醒一台機器,甚至一群機器,相當有趣。讀者若有興趣可以到

http://www.amd.com/us-en/Networking/TechnicalResources/0,,50_2334_2452_2456,00.html
下載,檔案大小約 924 KBytes 左右。


接下來我將說明遠端喚醒程式的原理與實作方式,由於牽涉到程式寫作,所以,如果讀者只對應用比較有興趣,那麼以下的部分可以略過。一般而言,實作遠端喚醒功能的方式有許多種,其中一種 AMD 稱為 Magic Package (神奇封包),他的原理相當簡單,就是網路卡它會利用極低的電壓,來維持一個基本運作,它會不斷的偵測外界傳來的訊號,如果該封包的訊號包含有一組 Magic Package 時,它就會發出開機訊號給主機板,讓主機板啟動,你的電腦當然也就能夠遠端喚醒,再加上遠端控管的軟體,哈哈,天下無敵,又省電,又方便….. 問題是這個 Magic Package 是怎樣的格式呢?

簡單,根據 AMD 的說法,這個 Magic Package 必須要是這樣的格式


DESTINATION SOURCE MISC FF FF FF FF FF FF 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 MISC CRC


仔細觀察這段格式,讀者可以發現,連續有六個位元組(Bytes),其值為 FF,這是同步訊號,接下來,連續重複 16 次出現的11 22 33 44 55 66,則是遠端欲開機電腦中,網路卡的 MAC 位址,這是神奇封包的最主要部分,其餘部分,在實作時可以忽略,因為主要部分只要符合前述的規定(6 bytes 的同步訊號 FF + 連續16次網卡的MAC 位址),它是可以位於封包的任何位置。


瞭解了原理,我們就可以開始撰寫簡易的遠端喚醒程式,由於要送出網路封包,所以,我們將運用 TCP/IP 協定來實作,一方面是較容易撰寫,二方面是TCP/IP協定的運用層面較廣,但運用TCP/IP來實作,有幾點是必須注意的:

(1) TCP/IP協定在傳輸層,分為TCP與UDP,我們必須選哪個?由於TCP的協定,是屬於可信賴性的協定,也就是溝通的雙方必須都要交握確認成功後,才開始傳資料,否則將產生錯誤訊息,顯然,選擇TCP協定將導致遠端喚醒程式無法運作,因為,被喚醒端尚未開機,所以,TCP在雙方交握確認階段是不可能成功的,當然資料也就傳不出去。

(2) 不管TCP或UDP都必須指定IP及Port號,IP位址部分應該填該網段的廣播位址,至於Port 號,由於遠端喚醒功能是由OSI的第二層鏈結層在處理,因此這部分可以不考慮,隨便填一個就好,80埠是相當不錯的選擇,因為它可以通過大部分的防火牆。

(3) MAC如何的取得?最正規的作法是利用ARP協定,透過程式事前取得,並建立成資料庫,但又是另一個主題了,本文將不介紹這部分,留待來日再談…….至於MAC位址,讀者就先啟動被喚醒端的電腦,利用 ipconfig/all 指令,先記下其 MAC位址,以便測試時填入。


以下為主要程式碼片段,其中 NMWOL 是 C++ Builder 5.0(Enterprise版本)所提供之 VCL 元件,在 FastNet 頁次中,元件名 NMUDP )




void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
byte mac[6]; // 存放被喚醒端 MAC Address
byte buf[102]; // 存放 magic package
int i,j; // 迴圈變數
 

// 讀入所輸入之 MAC 位址
mac[0] = StrToInt("0x"+Edit2->Text);
mac[1] = StrToInt("0x"+Edit3->Text);
mac[2] = StrToInt("0x"+Edit4->Text);
mac[3] = StrToInt("0x"+Edit5->Text);
mac[4] = StrToInt("0x"+Edit6->Text);
mac[5] = StrToInt("0x"+Edit7->Text);

// 建立 magic package 內容
// stage 1: 同步訊號
for (i=0; i<6; i++) {
buf = 0xFF;
}

// stage 2: 被喚醒端 Mac 位址
for (i=0; i<16; i++)
for (j=0; j<6; j++)
buf[(i*6+j+6)] = mac[j];

// 傳送 magic package 至被喚醒端
NMWOL->RemoteHost = Edit1->Text; // 設定被喚醒端的廣播 IP
NMWOL->RemotePort = 80; // 設定被喚醒端的廣播 Port Number
NMWOL->SendBuffer(buf, 102, 102); // 傳送,總共 102 Bytes( 6 + 16*6 )
ShowMessage("Magic Package 已經傳送....");

}



完整程式請按此 下載

程式執行畫面

 

written by 北縣教網張啟中 2002/03/05

 
多谢,我结贴了
 

Similar threads

D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
872
DelphiTeacher的专栏
D
后退
顶部