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, Len(Host) - InStr(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, ByVal R, 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

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于VB的远程开机程序,好像远程关机的见到比较多,远程开机见的并不多,一台电脑要想实现网上远程开机,其主板和网卡必须都支持远程唤醒功能,然后还得进入BIOS设置COMS,至于如何设置,不同的主板设置方法也可能不一样,请参考有关资料 设置好COMS后就可以用本程序发送远程开机命令了,如果想要广域网远程开机,那么除了设置COMS外,还得对路由器进行一定的设置。   '新建一个工程,在Form1上添加三个Text控件,三个标签控件,一个命令按钮和一个Winsock1控件,然后复制下面的代码到Form1   Dim myMAC(0 To 5) As Byte '欲唤醒的主机的MAC地址   Private Sub StrToMAC(ByVal myStrMAC As String) '将MAC地址的字符串形式转化为十六进制数值保存在数组myMAC里   Winsock1.SendData MagicPacket '发送魔术包(不管是在局域网还是在广域网,只要一台电脑检测到对应MAC的魔术包就会自动唤醒)   Winsock1.Protocol = sckUDPProtocol'使用UDP协议   Text1.Text = "010203ABCDEF" '欲唤醒的电脑的MAC地址,MAC地址的格式要求这样填(数值之间没有其它字符)   Text2.Text = "225.225.225.255" '广播地址(因为远程电脑已关机,没有IP地址,所以只能以广播形式找到要打开的电脑,广域网的话填路由器的IP)   Text3.Text = "0" '端口号,在局域网里的话就为0吧,广域网的话就看你的路由器开放哪个端口了!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值