BOOL WakeupPC(const unsigned char pMac[])
{
if(pMac == NULL)
{
DisMsg("Mac address error!");
return FALSE;
}
//Init socket.
WSADATA wsaData;
int err = WSAStartup(MAKEWORD(2,2),&wsaData);
if( err != 0 )
{
DisMsg("WSStartup error!");
return FALSE;
}
if(LOBYTE(wsaData.wVersion)!=2 ||
HIBYTE(wsaData.wVersion)!=2)
{
DisMsg("WinSock DLL not supports 2.2!");
return FALSE;
}
do{
SOCKET sFirst = socket(AF_INET,SOCK_DGRAM,0);
if(sFirst == INVALID_SOCKET)
{
DisMsg("socket create error");
break;
}
do{
BOOL bOptVal = TRUE;
int iOptLen = sizeof(BOOL);
err = setsockopt(sFirst,SOL_SOCKET,SO_BROADCAST,(char*)&bOptVal,iOptLen);
if(err == SOCKET_ERROR)
{
DisMsg("setsockopt error");
break;
}
char szMagicData[MAGIC_DATA_LEN];
memset(szMagicData,0xff,sizeof(szMagicData));
for(int i=MAC_ADDR_LEN;i<MAGIC_DATA_LEN;i+=MAC_ADDR_LEN)
{
memcpy(szMagicData+i,pMac,sizeof(unsigned char)*MAC_ADDR_LEN);
}
//地址结构
sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(0);
addr.sin_addr.S_un.S_addr = htonl(INADDR_BROADCAST);
err = sendto(sFirst,szMagicData,sizeof(szMagicData),0,(LPSOCKADDR)&addr,sizeof(addr));
if(err == SOCKET_ERROR)
{
DisMsg("sendto error");
break;
}
}while(FALSE);
err = closesocket(sFirst);
if(err == SOCKET_ERROR)
{
DisMsg("closesocket error");
break;
}
}while(FALSE);
WSACleanup();
return TRUE;
}