VB6 基于API的远程开机代码

利用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

相关文章

Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强...
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办...
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace...
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用...
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选...
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As Dat...