423,103 Members | 1,428 Online
Bytes IT Community
Submit an Article
Got Smarts?
Share your bits of IT knowledge by writing an article on Bytes.

Extended UdpClient Class that adds WOL (Wake On Lan) Function

!NoItAll
100+
P: 292
I have some windows software that manages multiple Linux boxes.
I wanted to add the ability to power up any of those boxes using WOL (Wake On Lan) so I wrote this UdpClient extension that adds an overloaded WakeFunction (see intellisense).
This code was translated (and simplified) from some existing C# examples found in various places.

Expand|Select|Wrap|Line Numbers
  1. Imports System.Net.Sockets
  2.  
  3. ''' <summary>
  4. ''' An extended UdpClient Class with WOL WakeFunction
  5. ''' </summary>
  6. Public Class WOLClass
  7.     Inherits UdpClient
  8.  
  9.     Public Sub New() : End Sub
  10.  
  11.     Public Sub New(IPAddress As String, NetMask As String)
  12.         Me.IPAddress = IPAddress
  13.         Me.NetMask = NetMask
  14.     End Sub
  15.  
  16.     Private Sub SetClientToBroadcastMode()
  17.         If Me.Active Then
  18.             Me.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, False)
  19.         End If
  20.     End Sub
  21.  
  22.     Public Property IPAddress As New String(String.Empty)
  23.  
  24.     Public Property NetMask As New String(String.Empty)
  25.  
  26.     ''' <summary>
  27.     ''' Send a magic packet to the entire subnet based on IP and NetMask properties to the MAC Address and Port
  28.     ''' </summary>
  29.     ''' <param name="MACAddress">The MAC Address of the machine to waken</param>
  30.     ''' <param name="Port">Remove port on destination system (default = 9)</param>
  31.     Public Function WakeFunction(MACAddress As String, Optional Port As Long = 9L) As Boolean
  32.         If Me.IPAddress.Length <> 0 AndAlso Me.NetMask.Length <> 0 Then
  33.             Return WakeFunction(Me.IPAddress, Me.NetMask, MACAddress, Port)
  34.         Else
  35.             Throw New Exception("IPAddress and NetMASK properties must be set before calling this overload")
  36.         End If
  37.     End Function
  38.  
  39.     ''' <summary>
  40.     ''' Sends a magic packet to the entire subnet based on IP and NetMask with the target set to the MAC Address
  41.     ''' </summary>
  42.     ''' <param name="IPAddress">The IP Address to which the Magic Packet is directed (can be a broadcast address)</param>
  43.     ''' <param name="NetMask">The Network Mask of the subnet</param>
  44.     ''' <param name="MacAddress">The targets MAC address as xx:xx:xx:xx:xx</param>
  45.     ''' <param name="Port">Remote port on destination system (default = 9)</param>
  46.     ''' 
  47.     Public Function WakeFunction(IPAddress As String, NetMask As String, MacAddress As String, Optional Port As Long = 9L) As Boolean
  48.  
  49.         Dim BrdAddress As Net.IPAddress = GetBroadcastAddress(Net.IPAddress.Parse(IPAddress).ToString, NetMask)
  50.         Dim Counter As Integer = 0
  51.         Dim bytes(1023) As Byte
  52.  
  53.         Using client As New WOLClass
  54.  
  55.             client.Connect(BrdAddress, Port)
  56.  
  57.             client.SetClientToBroadcastMode()
  58.  
  59.             For I As Integer = 0 To 5
  60.                 Counter = I
  61.                 bytes(Counter) = &HFF
  62.             Next
  63.  
  64.             Dim MacPieces As String() = MacAddress.Split({":"}, StringSplitOptions.RemoveEmptyEntries)
  65.  
  66.             For I As Integer = 0 To 15
  67.                 For J As Integer = 0 To 5
  68.                     Counter += 1
  69.                     bytes(Counter) = Byte.Parse(MacPieces(J), Globalization.NumberStyles.HexNumber)
  70.                 Next
  71.             Next
  72.  
  73.             Try
  74.                 client.Send(bytes, 1024I)
  75.                 Return True
  76.             Catch ex As Exception
  77.                 Throw New Exception(ex.Message)
  78.             End Try
  79.         End Using
  80.  
  81.     End Function
  82.  
  83.     ''' <summary>
  84.     ''' Returns the subnets broadcast address based on the provided IP Address and Subnet Mask
  85.     ''' </summary>
  86.     ''' <param name="IPAddress">Any IP in the subnet (can even be the current broadcast address)</param>
  87.     ''' <param name="NetMask">The NetMask of the the subnet</param>
  88.     ''' <returns></returns>
  89.     Private Function GetBroadcastAddress(IPAddress As String, NetMask As String) As Net.IPAddress
  90.  
  91.         Dim ThisAddress As Net.IPAddress = Net.IPAddress.Parse(IPAddress)
  92.         Dim ThisMask As Net.IPAddress = Net.IPAddress.Parse(NetMask)
  93.  
  94.         Dim IPPieces As String() = IPAddress.Split({"."}, StringSplitOptions.RemoveEmptyEntries)
  95.         Dim MaskPieces As String() = NetMask.Split({"."}, StringSplitOptions.RemoveEmptyEntries)
  96.  
  97.         Dim IPBytes As Byte() = ThisAddress.GetAddressBytes
  98.         Dim MaskBytes As Byte() = ThisMask.GetAddressBytes
  99.         Dim BroadcastAddress(3) As Byte
  100.  
  101.         For I As Integer = 0 To (IPBytes.Length - 1)
  102.             BroadcastAddress(I) = CByte((IPBytes(I) Or (MaskBytes(I) Xor 255)))
  103.         Next
  104.  
  105.         Return New Net.IPAddress(BroadcastAddress)
  106.  
  107.     End Function
  108. End Class
  109.  
Example Usage

Expand|Select|Wrap|Line Numbers
  1.         Using wc As New WOLClass("192.168.1.178", "255.255.255.0")
  2.             If wc.WakeFunction("ac:1f:6b:20:11:30") Then
  3.                 MsgBox("Magic Packet Sent", MsgBoxStyle.OkOnly Or MsgBoxStyle.Information)
  4.             End If
  5.         End Using
  6.  
2 Weeks Ago #1
Share this Article
Share on Google+