利用Magic Packet实现的远程开机代码
调用示例:
MagicPacket “192.168.1.100:54321” "A1-B2-C3-D4-E5-F6"
Private Const WSA_DescriptionLen = 256 Private Const WSA_DescriptionSize = WSA_DescriptionLen + 1 Private Const WSA_SYS_STATUS_LEN = 128 Private Const WSA_SysstatusSize = WSA_SYS_STATUS_LEN + 1 Private Const INVALID_SOCKET = -1 Private Const SOCKET_ERROR = -1 Private Const AF_INET = 2 Private Const SOCK_DGRAM = 2 Private Const IPPROTO_UDP = 17 Private Type HostEnt hName As Long hAliases As Long hAddrType As Integer hLength As Integer hAddrList As Long End Type Private Type SockAddr Sin_Family As Integer Sin_Port As Integer Sin_Addr As Long Sin_Zero(7) As Byte End Type Private Type WSADataType wVersion As Integer wHighVersion As Integer szDescription As String * WSA_DescriptionSize szSystemStatus As String * WSA_SysstatusSize iMaxSockets As Integer iMaxUdpDg As Integer lpvendorInfo As Long End Type Private Declare Function CloseSocket Lib "ws2_32.dll" Alias "closesocket" (ByVal hSocket As Long) As Long Private Declare Function Conn Lib "ws2_32.dll" Alias "connect" (ByVal hSocket As Long,Addr As SockAddr,ByVal NameLen As Long) As Long Private Declare Sub copyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any,Source As Any,ByVal Length As Long) Private Declare Function GetHostByName Lib "ws2_32.dll" Alias "gethostbyname" (ByVal HostName As String) As Long Private Declare Function Htons Lib "ws2_32.dll" Alias "htons" (ByVal HostShort As Integer) As Integer Private Declare Function iNet_Addr Lib "wsock32.dll" Alias "inet_addr" (ByVal S As String) As Long Private Declare Function Send Lib "ws2_32.dll" Alias "send" (ByVal hSocket As Long,Buf As Any,ByVal BufLen As Long,ByVal Flags As Long) As Long Private Declare Function Socket Lib "ws2_32.dll" Alias "socket" (ByVal af As Long,ByVal sType As Long,ByVal Protocol As Long) As Long Private Declare Function WSACleanup Lib "ws2_32.dll" () As Long Private Declare Function WSAStartup Lib "ws2_32.dll" (ByVal wVR As Long,lpWSAD As WSADataType) As Long Public Sub MagicPacket(ByVal Host As String,ByVal MAC As String) Dim WSAData As WSADataType,SA As SockAddr,hHost As HostEnt Dim hSocket As Long,Port As Long,R As Long,I As Integer,Data() As Byte If WSAStartup(&H202,WSAData) <> 0 Then WSACleanup Exit Sub End If Port = 9 '当不输入端口号时,默认端口号为9 If (InStr(Host,":") > 0) Then If IsNumeric(Right(Host,Len(Host) - InStr(Host,":"))) = True Then Port = CLng(Right(Host,":"))) Host = Left(Host,InStr(Host,":") - 1) End If hSocket = Socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP) SA.Sin_Family = AF_INET SA.Sin_Port = Htons(CInt("&H" & Hex(Port))) SA.Sin_Addr = iNet_Addr(Host) If SA.Sin_Addr = INVALID_SOCKET Then R = GetHostByName(Host) If R <> 0 Then copyMemory hHost,ByVal R,LenB(hHost) copyMemory R,ByVal hHost.hAddrList,LenB(R) copyMemory SA.Sin_Addr,hHost.hLength End If End If If Conn(hSocket,SA,LenB(SA)) = SOCKET_ERROR Then WSACleanup Exit Sub End If MAC = Replace(MAC,"-","") MAC = Replace(MAC,":","") ReDim Data(101) For I = 0 To 5 Data(I) = &HFF Next For I = 0 To 15 Data((I + 1) * 6) = CByte("&H" & Mid(MAC,1,2)) Data((I + 1) * 6 + 1) = CByte("&H" & Mid(MAC,3,2)) Data((I + 1) * 6 + 2) = CByte("&H" & Mid(MAC,5,2)) Data((I + 1) * 6 + 3) = CByte("&H" & Mid(MAC,7,2)) Data((I + 1) * 6 + 4) = CByte("&H" & Mid(MAC,9,2)) Data((I + 1) * 6 + 5) = CByte("&H" & Mid(MAC,11,2)) Next Send hSocket,Data(0),UBound(Data) + 1,0 CloseSocket hSocket End Sub
原文地址:https://www.jb51.cc/vb/256883.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。