远程开机关机

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

远程开机关机----从零教起

作为机房管理员,要管理的计算机较多,经常面临大量计算机要开启或关闭,如果每次逐一去开启或关闭,也是一项艰巨的任务,如果能从一台计算机上远程开启或关闭本局域网内的

一台或多台计算机,将是一件轻松快乐的事。

一、远程开机

1.对被开启计算机的硬件要求

要实现网络远程开机,对被开启的计算机而言需要电源、主板、网卡3件设备的支持。首先电源必须是符合ATX 2.03标准的ATX电源,而且其+5V的备用电流必须在600mA以上,以便能唤醒网卡。其次是主板和网卡都必须支持Wake-up On LAN(WOL)技术(即远程唤醒)。

可通过查看主板网卡使用说明书确认,对主板而言可直接查看BIOS设置中的“Power Management Setup”菜单中是否有“Wake on Lan”一项来确认,有则将“Wake on Lan”设置为“Enable”,开启远程唤醒功能。另外查看BIOS设置中是否有“Wake on PCI Card”,有则说明主板可通过PCI插槽直接向网卡供电,将其设置为“Enable”;没有则需要在主板的WOL接口(3针)和网卡的WOL接口之间连一根三芯远程唤醒电缆,以便主板给网卡供电。

2.远程开机原理

远程开机的实现,主要是向目标计算机发送特殊格式的数据包(包含有6个字节的“FF”和重复16遍的目标计算机的MAC地址,共102个字节的数据),目标计算机的网卡只要检测到数据包中某个片段含有这102个字节的数据,便会将该计算机唤醒,它是AMD公司开发推广的技术。所以远程开机需要知道目标计算机的MAC地址,如果要开启的计算机只有一台,可直接在该计算机上查看MAC地址并记录下来,但是如果有多台计算机需要开启,用这种方式麻烦且容易出错,所以应考虑编程解决这个问题。

3.编程获取局域网内各计算机的MAC地址

怎么获取局域网内各计算机的MAC地址呢?了解网络通信原理的人都知道,网络中两台计算机要相互通信,看似只要相互知道IP地址即可,但那只是在网络层上,在数据链路层上最终必须知道对方计算机网卡的物理地址,即MAC地址。那么网络通信时如何知道其它计算机的MAC地址呢?靠ARP(Address Resolution Protocol)即地址解析协议,通过在局域网内广播ARP请求包,对方即会响应,告知其MAC地址,双方计算机都会将对方的MAC地址及IP地址对应保存在一张地址映射表中,以备通信使用。所以编程时要发送一个ARP请求包

来获取指定计算机的MAC地址,Windows API中已提供现成的函数SendARP,其声明如下:

DWORD SendARP(IPAddr DestIP, IPAddr SrcIP,PULONG pMacAddr, PULONG

PhyAddrLen );

第一个参数为要获取其MAC地址的目标计算机机的IP地址,参数类型为IPAddr

,其实类型就是unsigned long (用户输入的目的主机的IP地址一般是字符串类型点式IP 地址,需要将其转换成一个3 2位的无符号长整数,可用inet_addr函数完成);第二个参数为源机的IP地址;第三个参数为存放目标计算机MAC地址的指针变量;第四个参数为存放目标计算机MAC地址字节长度的指针变量。该函数的定义在iphlpapi.h头文件中,所以要包含#include;该函数的实现在Iphlpapi.lib库文件中,要在项目设置的链接中加入库文件Iphlpapi.lib。(注意:VC6.0不含这两个文件,需网上下载,而VC7.0

中含有。)关键代码如下:

//将用户输入的目的主机的字符串类型点式IP地址转换成一个3 2位的无符号长整数:

ULONG ULDestIP=inet_addr(strIPAddr);

//发送ARP请求包获得远程MAC地址:

iRusult=SendARP(ULDestIP,(unsigned long)NULL,(PULONG)&ULMacAdd,&PhyAddrLen);

//由于获得的MAC地址是6字节的unsigned char数值,不便阅读,所以需要将其转换为字

符串:

sprintf(strMacAddr,"%.2x-%.2x-%.2x-%.2x-%.2x-%.2x",ULMacAdd[0],ULMacAdd[1],ULMa cAdd[2],ULMacAdd[3],ULMacAdd[4],ULMacAdd[5]);

为了实现获取机房内所有机器的MAC地址,可以采取循环的办法发送ARP请求包获得所有机器的MAC地址,考虑机房内机器的IP地址一般都是连续的,所以先获取IP地址最小的那台机器的MAC地址,然后逐一增加IP地址, 循环获取其它机器的IP地址。

//注意IP地址加一前先要将ULONG类型的IP地址从网络字节顺序转换为主机字节顺序,加

一后再从主机字节顺序转换为网络字节顺序。

ULDestIP=htonl(ntohl(ULDestIP)+1);

为了使用户能对比观察及关机的需要,程序中还获取了远程机的机器名,并与IP地址、MAC

地址一起显示在一个ListCtrl控件中。

//获取远程机器名:

struct hostent *RemoteHost;

RemoteHost=(struct hostent*)malloc(sizeof(struct hostent));

RemoteHost=gethostbyaddr((char*)&ULDestIP,4,AF_INET);

strcpy(strRemoteHostName,RemoteHost->h_name);

//将3 2位的无符号长整数IP地址转换成字符串类型点式IP地址:

struct in_addr sAddr;

sAddr.s_addr=ULDestIP;

strcpy(strIPAddr,inet_ntoa(sAddr));

//将远程机的机器名、IP地址、MAC地址一起显示在一个ListCtrl控件中:

int iItemNumber=m_ListHostInfo.GetItemCount();

相关文档
最新文档