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 程序主界面
|