摘 要:網(wǎng)絡(luò)遠程喚醒對網(wǎng)絡(luò)管理來說是一項具有實用性的技術(shù)。遠程喚醒的方法也多種多樣,在VB編程過程中,Winsock控件具有通過傳輸層協(xié)議進行微機的遠程通信功能。根據(jù)Winsock控件能夠發(fā)送帶有該網(wǎng)卡MAC地址的喚醒數(shù)據(jù)包的特點,利用VB編程的方法,開發(fā)出實現(xiàn)微機網(wǎng)絡(luò)遠程喚醒的程序,以實現(xiàn)網(wǎng)絡(luò)管理功能。
關(guān)鍵詞:VB編程;Winsock控件;MAC地址; 遠程喚醒
中圖分類號:TN919; TP316.7 文獻標識碼:A 文章編號:1004-373X(2010)14-0061-03
Wake-on-LAN by VB Programming
CAO Shu-hua
(Information Engineering Institute, Chang’an University, Xi’an 710064, China)
Abstract: The wake-on-LAN is a very practical technology for the network management. There are many ways for the wake-on-LAN, Winsock can carry out long-range PC communication by using transfer-layer agreements in the process of VB programming. Because of that Winsock control can send the wake-up packet with MAC address, a program of achieving wake-on-LAN of microcomputers was developed by VB programming to realize the network management.
Keywords: VB Programming; Winsock control; MAC address; wake-on-LAN
0 引 言
網(wǎng)絡(luò)遠程喚醒技術(shù)(wake-on-LAN,WOL)是一項由計算機硬件提供支持的,通過給網(wǎng)卡發(fā)送特定數(shù)據(jù)包從而命令網(wǎng)卡向主板發(fā)送開機指令的管理技術(shù)。它可以讓微機使用人員遠程喚醒計算機,并使它們自動完成一些管理服務(wù)[1]。
實現(xiàn)遠程喚醒的硬件條件:網(wǎng)卡、主板、電源都要支持網(wǎng)絡(luò)遠程喚醒[2]。
網(wǎng)絡(luò)管理人員經(jīng)常需要遠程喚醒多臺微機進行管理。網(wǎng)絡(luò)遠程喚醒的方法也各有不同,通過VC,Delphi語言編程都可以實現(xiàn)遠程喚醒,本文通過VB語言編程實現(xiàn)微機的網(wǎng)絡(luò)遠程喚醒。由于VB語言的普及程度更高,語句更易被理解。因此VB編程實現(xiàn)網(wǎng)絡(luò)的遠程喚醒程序更易根據(jù)客戶需要進行修改和使用。
1 VB實現(xiàn)微機的網(wǎng)絡(luò)遠程喚醒的原理
由于通過網(wǎng)絡(luò)遠程喚醒的計算機處于關(guān)機狀態(tài),所以不可能通過IP地址和計算機名等進行區(qū)別。但是每塊網(wǎng)卡都擁有惟一的MAC地址,網(wǎng)卡的MAC地址是識別計算機的惟一定位信息。知道被喚醒計算機網(wǎng)卡的MAC地址后,在本地計算機上運行遠程喚醒軟件,向網(wǎng)絡(luò)中發(fā)送帶有該網(wǎng)卡MAC地址的喚醒數(shù)據(jù)包。這時,被喚醒計算機雖然處于關(guān)機狀態(tài),但其網(wǎng)卡控制芯片卻能利用三芯連接線從主板上送來的電流(這是因為ATX電源雖然關(guān)閉了,但并沒有切斷主板上所有電源的供給),接收和處理網(wǎng)絡(luò)上傳來的信息包??刂菩酒ㄟ^檢查數(shù)據(jù)包中的地址信息,可以確認自己是否為該數(shù)據(jù)包的合法接收者。如果確認是合法接收者,則通過三芯連線向計算機發(fā)出開機信號,引導主板開啟計算機的電源并執(zhí)行相應(yīng)的程序。
下面敘述VB編程設(shè)計網(wǎng)絡(luò)遠程喚醒軟件。它是一個通過網(wǎng)卡MAC地址遠程喚醒計算機的軟件,并支持群集網(wǎng)絡(luò)遠程喚醒。
2 部分程序代碼
(1) 獲取微機MAC地址的程序
獲取本地計算機的MAC地址方法很多,最原始的方法是直接從網(wǎng)卡的說明書上獲取,但這不一定準確,還可通過在計算機上運行winipcfg.exe或ipconfig.exe等工具軟件來獲取[3]。下面是用VB編程實現(xiàn)獲取MAC地址的源程序[4-5]:
Private Function EthernetAddress(LanaNumber As Long) As String
Dim udtNCBAs NCB
Dim bytResponse As Byte
Dim udtASTAT As ASTAT
Dim udtTempASTAT As ASTAT
Dim lngASTAT As Long
Dim strOutAs String
Dim xAs Integer
udtNCB.ncb_command = NCBRESET
bytResponse = Netbios(udtNCB)
udtNCB.ncb_command = NCBASTAT
udtNCB.ncb_lana_num = LanaNumber
udtNCB.ncb_callname = \"* \"
udtNCB.ncb_length = Len(udtASTAT)
lngASTAT = HeapAlloc(GetProcessHeap(), HEAP_GENERATE_EXCEPTIONS Or HEAP_ZERO_MEMORY, udtNCB.ncb_length)
strOut = \"\"
If lngASTAT Then
udtNCB.ncb_buffer = lngASTAT
bytResponse = Netbios(udtNCB)
CopyMemory udtASTAT, udtNCB.ncb_buffer, Len(udtASTAT)
With udtASTAT.adapt
For x = 0 To 5
strOut = strOut RightMYM(\"00\" HexMYM(.adapter_address(x)), 2)
Next x
End With
HeapFree GetProcessHeap(), 0, lngASTAT
End If
EthernetAddress = strOut
End Function
Private Sub CmdClose_Click()
End
End Sub
Private Sub Form_Load()
Text1 = \"這臺機器的MAC地址是:\" EthernetAddress(0)
(2) 從另一臺計算機通過獲取的網(wǎng)卡MAC地址遠程喚醒該計算機
獲得網(wǎng)絡(luò)上所有機器的MAC地址之后,還必須把這些地址提供給腳本。利用一個獨立的文件保存MAC地址信息是較好的選擇。使用獨立的文件意味著不必把這些信息直接編寫到腳本代碼里面,從而使代碼具有更好的可移植性、更少出錯機會。總之,編寫腳本代碼時應(yīng)當養(yǎng)成良好的習慣,腳本的主要輸入數(shù)據(jù)應(yīng)當來自腳本之外,而不是嵌入腳本代碼之中。
以下是用VB編程實現(xiàn)微機遠程喚醒的源程序[6-9]:
Sub picmov()
Select Case Picture1.Left
Case 3600
Picture1.Left = 3650
wait 500
Case 3650
Picture1.Left = 3600
wait 250
End Select
DoEvents
End Sub
Private Sub Command1_Click(Index As Integer)
AbortThis = False
NumOfCounts = Text1.Text
Picture1.Visible = True
Adet = Text1.Text
Command1(Index).Enabled = False
Dim sHostName As String
Dim data As String
Dim MacAdd As String
Dim IPAddress As String
Winsock2.Protocol = sckUDPProtocol
Winsock2.RemoteHost = \"255.255.255.255\"
Winsock2.RemotePort = \"4000\"
If Index = 1 Then
For say = 0 To List1.ListCount - 1
List1.ListIndex = say
MacAdd = List1.List(say)
data = \"FFFFFFFFFFFF\"
For i = 1 To 16
data = data MacAdd
Next i
data = hex2ascii(data)
For t = 1 To Adet
Text2.Text = \"正在呼叫喚醒 \" MacAdd
′取消按鈕
If AbortThis Then GoTo Aborted
Winsock2.SendData data
picmov
Winsock2.Close
picmov
Text1.Text = t
DoEvents
Next
Next
Else
MacAdd = txtmac.Text
data = \"FFFFFFFFFFFF\"
For i = 1 To 16
data = data MacAdd
Next i
data = hex2ascii(data)
For t = 1 To Adet
Text2.Text = \"正在呼叫喚醒 \" MacAdd
′取消
If AbortThis Then GoTo Aborted
Winsock2.SendData data
picmov
Winsock2.Close
picmov
Text1.Text = t
DoEvents
Next
End If
End Sub
Public Sub wait(ByVal dblMilliseconds As Double)
Dim dblStart As Double
Dim dblEnd As Double
Dim dblTickCount As Double
dblTickCount = GetTickCount()
dblStart = GetTickCount()
dblEnd = GetTickCount + dblMilliseconds
Do
DoEvents
dblTickCount = GetTickCount()
Loop Until dblTickCount > dblEnd Or dblTickCount End Sub ′提取MAC地址,Macs.txt為腳本文件 Private Sub Form_Load() Dim Mac allmacs = ReadMacs(App.Path \"/Macs.txt\") Mac = Split(allmacs, \",\") ReDim PCs(UBound(Mac)) For t = 0 To UBound(Mac) SpltP = (InStr(Mac(t), \":\")) If SpltP > 0 Then PCs(t) = RightMYM(Mac(t), Len(Mac(t)) - SpltP) Mac(t) = MidMYM(Mac(t), 1, SpltP - 1) Else PCs(t) = \"N/A\" End If List1.AddItem Mac(t) Next End Sub Private Sub List1_Click() txtmac.Text = List1.List(List1.ListIndex) Text3.Text = PCs(List1.ListIndex) End Sub 3 使用方法 第一步獲取微機MAC地址程序運行后得到的結(jié)果,如圖1所示。 圖1 程序運行結(jié)果(一) 第二步通過MAC地址遠程喚醒微機程序運行后得到的結(jié)果,如圖2所示。 通過第一步、第二步程序的運行,可以遠程喚醒1臺或多臺微機。程序中使用的MAC地址是在局域網(wǎng)中獲取的,并在局域網(wǎng)中遠程喚醒微機取得成功。如果需要通過互聯(lián)網(wǎng)遠程喚醒微機還需做進一步修改和調(diào)試。 圖2 程序運行結(jié)果(二) 4 結(jié) 語 主要介紹了遠程喚醒技術(shù)基本原理、實現(xiàn)遠程喚醒所需的軟硬件條件,并給出局域網(wǎng)內(nèi)基于VB的遠程喚醒程序的VB編程主要代碼。遠程喚醒技術(shù)十分方便、實用,大大節(jié)省微機管理員的時間和提高工作效率,特別在微機機房的管理中得到廣泛的應(yīng)用[10]。實現(xiàn)微機遠程喚醒方法有很多,本文從VB編程設(shè)計角度加以研究、討論。對于廣域網(wǎng)上的遠程喚醒的方法還有待于更深層次的研究與討論。 參考文獻 [1]周文龍.跨網(wǎng)段遠程網(wǎng)絡(luò)喚醒計算機的實現(xiàn)[ J] .中國科技博覽,2009(14):193,78. [2]李金剛,劉春芳.局域網(wǎng)內(nèi)遠程喚醒多臺計算機的實現(xiàn)[ J] .福建電腦,2006(8):185-196. [3]馬鵬衛(wèi),拓守恒.網(wǎng)卡遠程喚醒的實現(xiàn)[ J] .科技資訊,2006(8):94-95. [4]寧正元,潘曉文,蔣萌輝,等.Visual Basic程序設(shè)計教程[M].北京:清華大學出版社,2004. [5]徐爾貴.VISUAL BASIC 6.0教程[M].北京:電子工業(yè)出版社,2001. [6]宋偉,吳建國.Visual Basic 6.0高級編程[M].北京:清華大學出版社,2002. [7]李廷文.VB控件高級編程[M].北京:人民郵電出版社,2000. [8][ 美] JAMES D.Foxall.VISUAL BASIC編程標準[M].北京:機械工業(yè)出版社,2000. [9]陳涌泉.Visual Basic第三方控件大全[M].北京:中國電力出版社,2002. [10]戚利.網(wǎng)絡(luò)遠程喚醒軟件的開發(fā)[ J] .電腦編程技巧與維護,2008(6):53-55.