内网远程唤醒,需要在系统中开启对远程唤醒的支持。原理是使用UDP广播,发送有16个相同MAC地址组成的数据包,网卡收到后会帮我们唤醒计算机。
需要被唤醒的计算机中,在设备管理器,找到对应的网络适配器(网卡),在网卡属性中启动【网络唤醒】功能
代码:
#include <stdio.h>
2 #include <arpa/inet.h>
3 #include <sys/ioctl.h>
4 #include <net/if.h>
5 #include <string.h>
6 #include <unistd.h>
7 #include <stdlib.h>
8
9
10 int main(int argc, char* argv[])
11 {
12 unsigned char mac[6]={0x00,0x10,0x20,0x30,0x40,0x50};//目的主机MAC地址,例如: 00:10:20:30:40:50
13 unsigned char packet[102];
14 struct sockaddr_in addr;
15 int sockfd, i,j, on = 1;
16
17 //构建magic packet
18 for(i=0;i<6;i++)
19 packet[i] = 0xFF;
20
21 for(i=1;i<17;i++)
22 for(j=0;j<6;j++)
23 packet[i*6+j] = mac[j];
24
25 //UDP
26 sockfd = socket(AF_INET, SOCK_DGRAM, 0);
27 //广播
28 setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST,&on, sizeof(on));
29 if(sockfd < 0)
30 exit(0);
31
32 memset((void*)&addr, 0, sizeof(addr));
33 addr.sin_family = AF_INET;
34 addr.sin_port = htons(10000);
35 addr.sin_addr.s_addr = inet_addr("xxx.xxx.xxx.xxx");//广播地址
36
37 sendto(sockfd, packet, sizeof(packet), 0, (struct sockaddr *)&addr, sizeof(addr));
38 close(sockfd);
39
40 return 0;
41 }