你好,欢迎来到电脑编程技巧与维护杂志社! [免费注册][请登录 杂志社简介广告服务读者反馈编程社区  
合订本订阅
 
 
您的位置:杂志经典 / 计算机安全与维护
远程开机关机(三)
 

4.发送远程开机数据包

已经知道了要开启计算机的MAC地址,接下来便可发送远程开机的数据包了,采用广播形式发送。关键代码如下:

SOCKET SocketData=socket(AF_INET, SOCK_DGRAM, 0); //创建套接字

    bool bOptVal=true;

    int iRusult=setsockopt(SocketData,SOL_SOCKET,SO_BROADCAST,(char FAR *)&bOptVal,sizeof(bOptVal));//设置发送方式为广播发送

    SOCKADDR_IN RecvAddr;

    RecvAddr.sin_family = AF_INET;

   RecvAddr.sin_port = htons(0);

    RecvAddr.sin_addr.s_addr=htonl(INADDR_BROADCAST);

为了将ListCtrl控件中所选择的计算机都开启,需要获取所有选择项中的MAC地址,然后构造远程开机数据包,逐机发送。关键代码如下:

POSITION   pos=m_ListHostInfo.GetFirstSelectedItemPosition(); 

while(pos)  

{   int nItem=m_AddrListCtrl.GetNextSelectedItem(pos);//获取选择项

    strMacAddr=m_ListHostInfo.GetItemText(nItem,3);//获取选择项的第四列数据MAC地址

    BYTE ByteMacAddr[6];

    //将字符串型式MAC地址转换为6个字节的数值:

    sscanf(strMacAddr, "%2x-%2x-%2x-%2x-%2x-%2x",&ByteMacAddr[0], &ByteMacAddr[1], &ByteMacAddr[2], &ByteMacAddr[3], &ByteMacAddr[4], &ByteMacAddr[5]);

    //构造远程开机数据包

    BYTE bDataPacket[102];

    memset(bDataPacket,0xFF,6);//先写入6个字节的FF

    for (int i=1; i<=16; i++)//然后循环16次写入6字节的MAC地址

        memcpy(bDataPacket+i*6,ByteMacAddr,6);

    //发送远程开机数据包

    iRusult=sendto(SocketData,(char FAR *)bDataPacket,102,0,(SOCKADDR *)&RecvAddr, sizeof(RecvAddr));

}

程序运行的主界面如图1所示。


1 程序主界面

  推荐精品文章

·2019年9月目录 
·2019年8月目录
·2019年7月目录
·2019年6月目录
·2019年5月目录
·2019年4月目录    
·2019年3月目录   
·2019年2月目录   
·2019年1月目录  
·探析云计算下应用软件用户数据安全问题
·地理空间集束线可视化表达
·Android智能净水机APP开发(一)
·2018年12月目录  
·springAOP的思想和设计以及实现

  联系方式
TEL:010-82561037
Fax: 010-82561614
QQ: 100164630
Mail:gaojian@comprg.com.cn

  友情链接
 
Copyright 2001-2010, www.comprg.com.cn, All Rights Reserved
京ICP备06048724号,电话/传真:010-82561037 82561614 ,Mail:gaojian@comprg.com.cn
地址:北京市海淀区长春桥路5号6号楼1209室,邮编:100089