[VB6][VB.net] 發送「魔術封包」執行「網路喚醒」的實作。

最近工作上要用到 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 的寫法一併貼在下面。

 

  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
    
    


ku3