18,356
社区成员
发帖
与我相关
我的任务
分享
void CRemoteOnDlg::OnButtonTurnon()
{
// TODO: Add your control notification handler code here
CString strMacAddr;//="00-01-20-55-63-63";
SOCKET SocketData=socket(AF_INET, SOCK_DGRAM, 0);//创建套接字
if (SocketData==INVALID_SOCKET)
{
m_strErrorMsg.Format("socket() failed; %d\n", WSAGetLastError());
MessageBox(m_strErrorMsg);
return ;
}
bool bOptVal=true;
int iRusult=setsockopt(SocketData,SOL_SOCKET,SO_BROADCAST,(char FAR *)&bOptVal,sizeof(bOptVal));//设置发送方式为广播发送
if(iRusult==SOCKET_ERROR )
{
m_strErrorMsg.Format("Failed to setsockopt %d.\n",WSAGetLastError());
MessageBox(m_strErrorMsg);
closesocket(SocketData);
WSACleanup();
return ;
}
SOCKADDR_IN RecvAddr;
RecvAddr.sin_family = AF_INET;
RecvAddr.sin_port = htons(0);
RecvAddr.sin_addr.s_addr=htonl(INADDR_BROADCAST);
POSITION pos=m_ListHostInfo.GetFirstSelectedItemPosition();
if(pos==NULL)
MessageBox("请选择要开的计算机!");
else
{
while(pos)
{ int nItem=m_ListHostInfo.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));
if(iRusult==SOCKET_ERROR)
{
m_strErrorMsg.Format("sendto() failed: %d\n", WSAGetLastError());
MessageBox(m_strErrorMsg);
}
}
}
closesocket(SocketData);
}
for (int i=1; i<=16; i++)//然后循环16写入6字节的MAC地址
memcpy(bDataPacket+i*6,ByteMacAddr,6);
m_strErrorMsg.Format("SocketData:%u %u %p\n%p\n%p",SocketData,SocketTemp,&SocketData,bDataPacket,ByteMacAddr);
MessageBox("开启成功!");
//发送远程开机数据包
iRusult=sendto(SocketTemp,(char FAR *)bDataPacket,102,0,(SOCKADDR *)&RecvAddr, sizeof(RecvAddr));
for (int i=1; i<=16; i++)//然后循环16写入6字节的MAC地址
memcpy(bDataPacket+i*6,ByteMacAddr,6);
m_strErrorMsg.Format("SocketData:%u %u %p\n%p\n%p",SocketData,SocketTemp,&SocketData,bDataPacket,ByteMacAddr);
MessageBox(m_strErrorMsg);
//发送远程开机数据包
iRusult=sendto(SocketData,(char FAR *)bDataPacket,102,0,(SOCKADDR *)&RecvAddr, sizeof(RecvAddr));
for (int i=1; i<=16; i++)//然后循环16写入6字节的MAC地址
memcpy(bDataPacket+i*6,ByteMacAddr,6);
void CRemoteOnDlg::OnButtonTurnon()
{
// TODO: Add your control notification handler code here
CString strMacAddr;//="00-01-20-55-63-63";
SOCKET SocketData=socket(AF_INET, SOCK_DGRAM, 0);//创建套接字
if (SocketData==INVALID_SOCKET)
{
m_strErrorMsg.Format("socket() failed; %d\n", WSAGetLastError());
MessageBox(m_strErrorMsg);
return ;
}
bool bOptVal=true;
int iRusult=setsockopt(SocketData,SOL_SOCKET,SO_BROADCAST,(char FAR *)&bOptVal,sizeof(bOptVal));//设置发送方式为广播发送
if(iRusult==SOCKET_ERROR )
{
m_strErrorMsg.Format("Failed to setsockopt %d.\n",WSAGetLastError());
MessageBox(m_strErrorMsg);
closesocket(SocketData);
WSACleanup(); /* 最好放到析构函数里,楼主注释掉这行试试release version */
return ;
}
SOCKADDR_IN RecvAddr;
RecvAddr.sin_family = AF_INET;
RecvAddr.sin_port = htons(0);
RecvAddr.sin_addr.s_addr=htonl(INADDR_BROADCAST);
POSITION pos=m_ListHostInfo.GetFirstSelectedItemPosition();
if(pos==NULL)
MessageBox("请选择要开的计算机!");
else
{
while(pos)
{ int nItem=m_ListHostInfo.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));
if(iRusult==SOCKET_ERROR)
{
m_strErrorMsg.Format("sendto() failed: %d\n", WSAGetLastError());
MessageBox(m_strErrorMsg);
}
}
}
closesocket(SocketData);
}