[VB6][VB.net] 發送「魔術封包」執行「網路喚醒」的實作。
http://www.dotblogs.com.tw/ku3/archive/2011/12/28/63597.aspx
最近工作上要用到 WOL 功能,把過去用在 VB6 上面的方法改用 VB2010 重新整理了一下:
發送「魔術封包」對電腦執行「網路喚醒」(Wake On Lan)的作法。(各通訊 Port 用途參考)
附帶說明一下:主機要能被喚醒,網卡需支援 WOL 且主機 BIOS 要開啟此功能,同時網卡進階設定要選接收魔法封包(Magic Packet)。
把 VB6 和 VB.net 的寫法一併貼在下面。
1.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
2. 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 |