可执行文件
WakeOnLan.exe

C:\Users\Administrator>WakeOnLan.exe 192.168.xx.xx 9C-5C-00-00-00-00

[1] : 192.168.xx.xx

[2] : 9C-5C-00-00-00-00

开机命令发送完成!


源码:WakeOnLan.cpp(遵循GPL开源协议)
 1 //
 2 // Copyright (c) whentec.com. All rights reserved.
 3 // 
 4 
 5 #include <iostream>
 6 #include <WinSock2.h>
 7 #pragma comment(lib, "WS2_32.lib")
 8 #pragma warning(disable : 4996)
 9 
10 inline  std::string EraseChar(std::string& src, char chDst) {
11     auto strNoDot = std::remove(src.begin(), src.end(), chDst);
12     src.erase(strNoDot, src.end());
13     return src;
14 }
15 
16 // 可以识别 9C-5C-00-00-00-00、9C:5C:00:00:00:00
17 // 不能识别9C5000000000
18 inline void Mac2Hex(const char* pszMac, byte* bufMac) {
19     if (!pszMac || !bufMac)
20         return;
21     if (strlen(pszMac) < 17)
22         return;
23 
24     char* pEnd = NULL;
25     for (int n = 0; n < 6; n++) {
26         *(bufMac + n) = (byte)strtol(pszMac, &pEnd, 16);
27         pszMac = pEnd+1;
28     }
29 }
30 
31 int main(int argc, char* argv[])
32 {
33 
34     if (argc < 3) {
35         std::cout << "请输入命令参数,格式如下:" << std::endl;
36         std::cout << "wakeonlan.exe 192.168.x.x 9C-5C-XX-00-00-00" << std::endl;
37     }
38 
39     for (int n = 1; n < argc; n++) {
40         std::cout << "[" << n << "] : " << argv[n] << std::endl;
41     }
42 
43     WSADATA data;
44     WORD w = MAKEWORD(2, 2);
45     ::WSAStartup(w, &data);
46     SOCKET sock;
47     sock = ::socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
48 
49     sockaddr_in addr;
50     addr.sin_family = AF_INET;
51     addr.sin_port = htons(9);
52     addr.sin_addr.S_un.S_addr = inet_addr(argv[1]);
53 
54     char mac[20];
55     strncpy(mac, argv[2], sizeof(mac) - 1);
56     byte bufMac[6];
57     Mac2Hex(mac, bufMac);
58 
59     byte bufSend[102];
60     for (int n = 0; n < 6; n++) {
61         bufSend[n] = (byte)0xFF;
62     }
63     for (int n = 0; n < 16; n++) {
64         for (int m = 0; m < 6; m++) {
65             bufSend[6 + 6 * n + m] = bufMac[m];
66         }
67     }
68     // 
69     ::sendto(sock, (const char*)bufSend, sizeof(bufSend), 0, (SOCKADDR*)&addr, sizeof(SOCKADDR));
70 
71     ::closesocket(sock);
72     ::WSACleanup();
73 
74     std::cout << "开机命令发送完成!\n";
75 }
76