免費論壇 繁體 | 簡體
Sclub交友聊天~加入聊天室當版主
分享
返回列表 回復 發帖

[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
返回列表