远程开机的原理与代码实现

继续聊一个无客户端的话题,很多机房管理软件中的常见的一个功能:远程开机,电脑是关闭就算电脑中安装了你客户端关机状态下也没有运行,是如何响应指令呢,肯定不是通过客户端了。
其实远程开机就是一种网络唤醒(Wakeup On LAN)绝大多数电脑的主板BIOS  都支持这项功能,如果BIOS 中没有开启则需要手工打开。电脑没有开机前网卡没有IP 地址,网络通讯时该如何发送数据? 这里就要用到广播包,广播包顾名思意就是不针对具体的目标向一个网段范围内所有的地址同时发出,和你用收音机接收广播的道理相同。


网络唤醒数据包的结构,这个是规范按规范来就可以了:
UDP广播包,端口不限
数据是 
FF-FF-FF-FF-FF-FF 接着目标计算机的 MAC 地址重复 16 次
注意,这里是UDP 的广播包,与我们前面分享中均使用的TCP 有一定的区别


直接上代码:
void CAppRunServerView::StartNETPC( CString MACstr )
{
    int dstaddr[6];
    char mac[20];
    int j;
    for (  j=0;j<MACstr.GetLength();j++ )
    {
        mac[j]= MACstr.GetAt(j);
    }
    mac[j]='\0';
    int i = sscanf( mac,"%2x:%2x:%2x:%2x:%2x:%2x",
                       &dstaddr[0],
                       &dstaddr[1],
                       &dstaddr[2],
                       &dstaddr[3],
                       &dstaddr[4],
                       &dstaddr[5]);
    if (i!=6)
    {
        return;
    }
    unsigned char ether_addr[6];
    for( i=0; i<6; i++ )
        ether_addr[i]=dstaddr[i];
    //构造Magic   Packet
    unsigned char magicpacket[200];
    memset(magicpacket,0xff,6);
    int packetsize=6;
    for ( i=0; i<16; i++ )
    {
        memcpy( magicpacket + packetsize , ether_addr, 6 );
        packetsize += 6;
    }
    WSADATA WSAData;
    if( WSAStartup( MAKEWORD(2,0), &WSAData ) != 0 )
    {


        return;
    }
    //创建socket
    SOCKET sock = socket( AF_INET,SOCK_DGRAM,0 );
    if ( sock == INVALID_SOCKET )
    {


        return;
    }
    //设置为广播发送
    BOOL bOptVal=TRUE;
    int iOptLen=sizeof(BOOL);
    if ( setsockopt( sock, 
                     SOL_SOCKET, 
                     SO_BROADCAST, 
                    (char*)&bOptVal,iOptLen) == SOCKET_ERROR )
    {
        closesocket(sock);
        WSACleanup();
        return;
    }
    sockaddr_in to;
    to.sin_family = AF_INET;
    to.sin_port = htons(0);
    to.sin_addr.s_addr = htonl( INADDR_BROADCAST );
    //发送Magic   Packet
    if ( sendto( sock,(const char*)magicpacket,packetsize,0,
                ( const    struct sockaddr*)&to, 
                sizeof(to) )==SOCKET_ERROR )
    {
        return;
    }
    else
    {
        //MessageBox( _T("发送成功") );
       
    }
    closesocket(sock);
    WSACleanup();
}



有几个前提条件,这台电脑的MAC 这肯定得先知道(废话)
这台电脑的BIOS  支持网络唤醒;
这台电脑在网络(交换机)上曾经至少至少工作过一次与别人通讯过一次,只有这样交换机中的MAC 表才对客户机有记录。否则再帅从没有打过卡前台妹纸也不能让你只刷新脸啊。
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值