|
/******************************************************************** * 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; }
|