Code: Select all
IncludeFile "WinsockFunctions.pb"
Declare SendMagicPacket(strSubnet.s, strMAC.s)
Declare MACToByteArray(strMAC.s)
Declare.l hex2dec(h$)
Declare Open_frm_Main()
Structure magicPacket
magicPacketData.b[102]
EndStructure
myMagic.magicPacket
Dim MACBytes.l(5)
;- ProgrammEntrypoint
Open_frm_Main()
;-Wake on LAN
Procedure SendMagicPacket(strSubnet.s, strMAC.s)
Protected counter.l
Protected index.b
OnErrorGoto(?errHandler)
;Convert the MAC Adress to Byte Array
MACToByteArray(strMAC)
For counter = 0 To 5
myMagic.magicPacket\magicPacketData[counter] = 255
Next
For index = 0 To 15
For counter = 0 To 5
myMagic.magicPacket\magicPacketData[index*6+counter+6] = MACBytes(counter)
Debug "MAC : "+Str(myMagic.magicPacket\magicPacketData[index*6+counter+6])
Next
Next
For idx = 0 To 101
;Debug "myMAC : "+Str(idx)+"="+Str(myMagic.magicPacket\magicPacketData[idx])
;Debug myMagic.magicPacket\magicPacketData[idx]
Next
wsVer=InitWinsock()
If wsVer=0
MessageRequester("Error","Problem initializing Winsock",0):End
Else
Debug "Winsock "+Str(wsVer & 255)+"."+Str((wsVer/256) & 255)+" started"
EndIf
udpidx=InitUDP(7)
If udpidx>0
Debug "UDP bind on port 7 successful"
Else
Debug "Unable to bind port 7, address in use?"
ProcedureReturn
EndIf
Debug "Sizeof="+Str(SizeOf(myMagic))
; Inserted code --------------------------------------------------------
#SOL_SOCKET = $FFFF
#SO_KEEPALIVE = $8 ; send keepalive messages
socket_keepalive.b = 1
client_socket1.l = setsockopt_(sockets(udpidx)\sck, #SOL_SOCKET, #SO_BROADCAST, @socket_keepalive, 1)
;-----------------------------------------------------------------------
SendUDP(Sockets(udpidx)\sck,@myMagic,SizeOf(myMagic),"255.255.255.255",7)
Debug udpidx
Debug Sockets(udpidx)\sck
MessageRequester("Wake", "Wake on Lan Sent")
terminatewinsock()
ProcedureReturn
errHandler:
EndProcedure
Procedure MACToByteArray(strMAC.s)
Protected counter.l
Protected value.s
Protected lngBinValue.l
For counter = 0 To 5
MACBytes(counter) = 0
Next
For counter = 1 To 11 Step 2
value = Mid(strMAC, counter, 2)
lngBinValue = hex2dec(value)
idx=(counter - 1) / 2
Debug "MACtoByteArray : "+Str(idx)+"="+Str(lngBinValue)
MACBytes(idx) = lngBinValue
Next
EndProcedure
Procedure.l hex2dec(h$)
h$=UCase(h$)
For r=1 To Len(h$)
d<<4 : a$=Mid(h$,r,1)
If Asc(a$)>60
d+Asc(a$)-55
Else
d+Asc(a$)-48
EndIf
Next
ProcedureReturn d
EndProcedure
;- Window Constants
;
Enumeration
#frm_Main
EndEnumeration
;- Gadget Constants
;
Enumeration
#txt_TargetSubnet
#cmd_Send
#lbl_TargetSubnet
#lbl_TargetMAC
#txt_TargetMac
EndEnumeration
Procedure Open_frm_Main()
If OpenWindow(#frm_Main, 245, 73, 296, 110, #PB_Window_SystemMenu | #PB_Window_TitleBar | #PB_Window_ScreenCentered , "Wake on Lan")
If CreateGadgetList(WindowID())
TextGadget(#lbl_TargetSubnet, 7, 10, 83, 20, "Broadcast")
TextGadget(#lbl_TargetMAC, 7, 40, 83, 20, "Target-MAC")
StringGadget(#txt_TargetSubnet, 100, 10, 190, 20, "")
StringGadget(#txt_TargetMac, 100, 40, 190, 20, "")
ButtonGadget(#cmd_Send, 190, 70, 100, 30, "Send")
EndIf
EndIf
EndProcedure
;- Main Loop
lngQuit.l
lngWindowMessage.l
SetGadgetText(#txt_TargetSubnet, "255.255.255.255")
; Rolf 000B6A969431
; Klaus 000C6EB8CEEB
SetGadgetText(#txt_TargetMac, "000C6EB8CEEB")
Repeat
lngWindowMessage = WaitWindowEvent()
If lngWindowMessage = #PB_Event_CloseWindow
lngQuit = 1
EndIf
If lngWindowMessage = #PB_Event_Gadget
If EventGadgetID() = #cmd_Send
strTargetSubnet$ = GetGadgetText(#txt_TargetSubnet)
strTargetMAC$ = GetGadgetText(#txt_TargetMac)
If Len(strTargetSubnet$) = 0 Or Len(strTargetMAC$) = 0
MessageRequester("Error", "Incomplete Entries")
Else
SendMagicPacket(strTargetSubnet$, strTargetMAC$)
EndIf
EndIf
EndIf
Until lngQuit = 1