最近工作上要用到 WOL 功能,把過去用在 VB6 上面的方法改用 VB2010 重新整理了一下:
發送「魔術封包」對電腦執行「網路喚醒」(Wake On Lan)的作法。(各通訊 Port 用途參考)
附帶說明一下:
主機要能被喚醒,網卡需支援 WOL 且主機 BIOS 要開啟此功能,同時網卡進階設定要選接收魔法封包(Magic Packet)。
最近工作上要用到 WOL 功能,把過去用在 VB6 上面的方法改用 VB2010 重新整理了一下:
發送「魔術封包」對電腦執行「網路喚醒」(Wake On Lan)的作法。(各通訊 Port 用途參考)
附帶說明一下:主機要能被喚醒,網卡需支援 WOL 且主機 BIOS 要開啟此功能,同時網卡進階設定要選接收魔法封包(Magic Packet)。
把 VB6 和 VB.net 的寫法一併貼在下面。
-
VB6 做法:
Private Sub Command1_Click() WOL "00-25-11-88-f4-f7" End Sub Sub WOL(mac As String) On Error GoTo er0 '---建立 Winsock 元件--- Dim Winsock1 As Object Set Winsock1 = CreateObject("MSWinsock.Winsock") If Winsock1.State <> sckClosed Then Winsock1.Close '---準備封包內容--- Dim b(101) As Byte tmp = Split(mac, "-") '解出 MAC 的6個位元組 For i = 0 To 5: b(i) = 255: Next '先放6個 FF 到陣列 For i = 0 To 15: For j = 0 To 5 b(6 + i * 6 + j) = Val("&H" & tmp(j)) '再放16組 MAC Address Next Next '---送出封包--- With Winsock1 .Protocol = sckUDPProtocol .RemoteHost = "255.255.255.255" '<--------------- 網段第 255 位址為廣播位址 .RemotePort = 9 '<----------------任選一個 Remote Port .LocalPort = CStr(Int(Rnd * 10000 + 49152)) '<---任選一個 Local Port .Bind .SendData b() .Close End With Exit Sub er0: '---若發生錯誤--- MsgBox "發生例外!" End Sub
-
VB.net 做法:
Imports System.Net.Sockets Imports System.Net Imports System.Net.NetworkInformation Public Class Form1 '---按鈕事件程序--- Private Sub Button1_Click() Handles Button1.Click '---這個 WOL 方法在類別中宣告為 Shared 不需用 New 就可直接使用--- 網路.WOL("00-25-11-88-f4-f7") End Sub End Class Class 網路 '------------------------------------------------- ' 傳入參數:要開機的 Mac Address ' 字串格式:1. "00-25-11-88-f4-f7" ' 2. "00:25:11:88:f4:f7" '------------------------------------------------- Public Shared Sub WOL(Mac As String) Dim b(101) As Byte Try '---建立封包陣列--- Dim tmp = Mac.Split({":"c, "-"c, " "c}) For i = 0 To 5 : b(i) = &HFF : Next '---先放6個 FF 到陣列--- For i = 0 To 15 '---再放連續 16 次要開機電腦的 MAC Address--- For j = 0 To 5 : b(6 + i * 6 + j) = Val("&H" & tmp(j)) : Next Next Catch ex As Exception MsgBox("輸入的 MAC 格式不確!" & vbCrLf & _ "格式應為:12-34-56-78-9A-BC" & vbCrLf & _ " 或:12:34:56:78:9A:BC" & vbCrLf & _ " 或:12 34 56 78 9A BC") Return End Try Try '--- 使用 Socket 類別送出封包--- If Not NetworkInterface.GetIsNetworkAvailable Then Throw New Exception("網路無法使用!") End If Dim SOCK As New Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp) Dim EndPoint = New IPEndPoint(IPAddress.Broadcast, 9) SOCK.Connect(EndPoint) SOCK.Send(b) Catch ex As Exception MsgBox(ex.Message) End Try End Sub End Class