我已经重做这个答案以回应留下的评论......
首先对于关闭命令尝试以下操作:
main()
{
system("c:\\WINDOWS\\System32\\shutdown /s /t 0");
return 0;
}
Further information at this tutorial
现在起床了……
我认为在 BIOS 中没有 Wake-On-Lan 的情况下无法在桌面上启动,并设置客户端向其发送魔术包。
所以我认为最好的方法是让一个设备位于同一子网上来处理启动魔术包的发送......这不是一个很棒的选择,但如果你正在寻找明确的关机,那么有限无需手动操作即可重新启动它的方法。
就像背景一样,魔术包地址帧以以下格式完成 - 6*255 又名 0xFF,目标 MAC 地址重复 16 次。因此,如果您的 MAC 地址为 01:02:03:04:05:06,则帧将如下所示:
FFFFFFFFFFFF010203040506010203040506010203040506010203040506
010203040506010203040506010203040506010203040506010203040506
010203040506010203040506010203040506010203040506010203040506
010203040506010203040506
See WOL Mini HOWTO - Chapter 2
在 C++ 中,数据包本身可以这样构造,在目标地址的每个部分输入转换。
unsigned char tosend[102];
unsigned char mac[6];
/** first 6 bytes of 255 **/
for(int i = 0; i < 6; i++) {
tosend[i] = 0xFF;
}
/** store mac address **/
mac[0] = 0x01;
mac[1] = 0x02;
mac[2] = 0x03;
mac[3] = 0x04;
mac[4] = 0x05;
mac[5] = 0x06;
/** append it 16 times to packet **/
for(int i = 1; i <= 16; i++) {
memcpy(&tosend[i * 6], &mac, 6 * sizeof(unsigned char));
}
然后像这样创建一个发送方,它将向子网上的所有设备广播数据包,但刚刚构建的帧会传达 MAC 地址:
int udpSocket;
struct sockaddr_in udpClient, udpServer;
int broadcast = 1;
udpSocket = socket(AF_INET, SOCK_DGRAM, 0);
/** you need to set this so you can broadcast **/
if (setsockopt(udpSocket, SOL_SOCKET, SO_BROADCAST, &broadcast, sizeof broadcast) == -1) {
perror(“setsockopt (SO_BROADCAST)”);
exit(1);
}
udpClient.sin_family = AF_INET;
udpClient.sin_addr.s_addr = INADDR_ANY;
udpClient.sin_port = 0;
bind(udpSocket, (struct sockaddr*)&udpClient, sizeof(udpClient));
/**make packet as shown above**/
**/** set server end point (the broadcast address)**/
udpServer.sin_family = AF_INET;
udpServer.sin_addr.s_addr = inet_addr(“192.168.1.255″);
udpServer.sin_port = htons(9);
/** send the packet **/
sendto(udpSocket, &tosend, sizeof(unsigned char) * 102, 0, (struct sockaddr*)&udpServer, sizeof(udpServer));**
Wake on LAN tutorial - reference for C++ example