/********************************************************************
* created: 2004/06/02
* created: 2:6:2004 10:24
* filename: c:\documents and settings\administrator\桌面\wakeup.cpp
* file path: c:\documents and settings\administrator\桌面
* file base: wakeup
* file ext: cpp
* author: XiaoPing Zhang
*
* purpose:
*********************************************************************/
#include "stdafx.h"
#include
#define MAC_ADDR_LEN 6
#define MAGIC_DATA_LEN 102
#pragma comment(lib, "iphlpapi.lib")
BOOL GetMacFromIP(const char * pIP)
{
HRESULT hr;
IPAddr ipAddr;
ULONG pulMac[2];
ULONG ulLen;
ipAddr = inet_addr ("216.145.25.31");
memset (pulMac, 0xff, sizeof (pulMac));
ulLen = 6;
hr = SendARP (ipAddr, 0, pulMac, &ulLen);
printf ("Return %08x, length %8d\n", hr, ulLen);
size_t i, j;
char * szMac = new char[ulLen*3];
PBYTE pbHexMac = (PBYTE) pulMac;
//
// Convert the binary MAC address into human-readable
//
for (i = 0, j = 0; i < ulLen - 1; ++i) {
j += sprintf (szMac + j, "%02X:", pbHexMac[i]);
}
sprintf (szMac + j, "%02X", pbHexMac[i]);
printf ("MAC address %s\n", szMac);
delete [] szMac;
return TRUE;
}
// 输入6个字节的mac地址
BOOL WakeupSinglePC(const unsigned char* pMac)
{
// TODO: Add your command handler code here
if (pMac == NULL)
{
TRACE("Mac address error!");
return FALSE;
}
WSADATA wsaData;
int err = WSAStartup( MAKEWORD(2, 2), &wsaData );
if ( err != 0 )
{
TRACE("WSAStartup error %d !", WSAGetLastError());
return FALSE;
}
if ( LOBYTE( wsaData.wVersion ) != 2 ||
HIBYTE( wsaData.wVersion ) != 2 )
{
TRACE("WinSock DLL not supports 2.2 !");
return FALSE;
}
do
{
SOCKET sFirst = socket(AF_INET, SOCK_DGRAM, 0);
if (sFirst == INVALID_SOCKET)
{
TRACE("socket error %d !", WSAGetLastError());
break;
}
do
{
BOOL bOptVal = TRUE;
int iOptLen = sizeof(BOOL);
err = setsockopt(sFirst, SOL_SOCKET, SO_BROADCAST, (char*)&bOptVal, iOptLen);
if (err == SOCKET_ERROR)
{
TRACE("setsockopt error %d !", WSAGetLastError());
break;
}
char szMagicData[MAGIC_DATA_LEN];
memset(szMagicData, 0xff, sizeof(szMagicData));
for(int i=MAC_ADDR_LEN; i
{
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_addr = htonl(INADDR_BROADCAST);
err = sendto(sFirst, szMagicData, sizeof(szMagicData), 0, (LPSOCKADDR)&addr, sizeof(addr));
if (err == SOCKET_ERROR)
{
TRACE("sendto error %d !", WSAGetLastError());
break;
}
} while(0);
err = closesocket(sFirst);
if (err == SOCKET_ERROR)
{
TRACE("closesocket error %d !", WSAGetLastError());
break;
}
} while(0);
err = WSACleanup();
if ( err == SOCKET_ERROR )
{
TRACE("WSACleanup error %d !", WSAGetLastError());
return FALSE;
}
return TRUE;
}
// 输入6个字节的mac地址数组
BOOL WakeupMultiPC(int iNum, const unsigned char* pszMac[])
{
// TODO: Add your command handler code here
if (pszMac == NULL)
{
TRACE("Mac address Error!", WSAGetLastError());
return FALSE;
}
WSADATA wsaData;
int err = WSAStartup( MAKEWORD(2, 2), &wsaData );
if ( err != 0 )
{
TRACE("WSAStartup Error %d !", WSAGetLastError());
return FALSE;
}
if ( LOBYTE( wsaData.wVersion ) != 2 ||
HIBYTE( wsaData.wVersion ) != 2 )
{
TRACE("WinSock DLL not supports 2.2");
return FALSE;
}
do
{
SOCKET sFirst = socket(AF_INET, SOCK_DGRAM, 0);
if (sFirst == INVALID_SOCKET)
{
TRACE("socket error %d !", WSAGetLastError());
break;
}
do
{
BOOL bOptVal = TRUE;
int iOptLen = sizeof(BOOL);
err = setsockopt(sFirst, SOL_SOCKET, SO_BROADCAST, (char*)&bOptVal, iOptLen);
if (err == SOCKET_ERROR)
{
TRACE("setsockopt error %d !", WSAGetLastError());
break;
}
sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(0);
addr.sin_addr.s_addr = htonl(INADDR_BROADCAST);
char szMagicData[MAGIC_DATA_LEN];
for (int index=0; index
{
memset(szMagicData, 0xff, sizeof(szMagicData));
for(int i=MAC_ADDR_LEN; i
{
memcpy(szMagicData+i, pszMac[index], sizeof(unsigned char)*MAC_ADDR_LEN);
}
err = sendto(sFirst, szMagicData, sizeof(szMagicData), 0, (LPSOCKADDR)&addr, sizeof(addr));
if (err == SOCKET_ERROR)
{
TRACE("sendto error %d !", WSAGetLastError());
break;
}
}
} while(0);
err = closesocket(sFirst);
if (err == SOCKET_ERROR)
{
TRACE("closesocket error %d !", WSAGetLastError());
break;
}
} while(0);
err = WSACleanup();
if ( err == SOCKET_ERROR )
{
TRACE("WSACleanup error %d !", WSAGetLastError());
return FALSE;
}
return TRUE;
}