一:总的说来,读取配置 .pclist 获取mac地址。
内容格式如下:
macaddr pc_name
6c:0b:84:68:17:10 ubuntu3
二:获取socket并设置它的属性
三:设置并发送magic包
备注:运行这个程序后,可能PC会堵塞,原因是要设置PC的BIOS使其支持通过网卡启动PC。
int status = 0;
FILE *list;
int sockfd;
char magic[BUFMAX];
struct sockaddr_in sin;
unsigned char mac[MACLEN];
char defpath[128];
char line[128], *entry;
int i;
if (argc == 1) {
sprintf(defpath, "%s/%s", getenv("HOME"), ".pclist");
list = fopen(defpath, "r");
if (NULL == list)
{
fprintf(stderr, "failed to read ~/.pclist, error(%d)\n", errno);
return -1;
}
while (NULL != fgets(line, sizeof(line), list))
{
/* skip over leading whitespace */
entry = skip_whitespace(line);
/* ignore blank/comment line */
if (*entry == '\n' || *entry == '#')
continue;
/* pick up the mac address */parse_mac_address(entry, &mac[0]);
fclose(list);
goto do_wake;
}
fclose(list);
fprintf(stderr, "failed to read entry in .pclist\n");
return -1;
} else if (argc == 2) {
parse_mac_address(argv[1], &mac[0]);
} else {
fprintf(stderr, "%s", help);
return 0;
}
do_wake:
printf("Waking up personal computer, MAC address "%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
/* * create magic packet<br> */
int size = 6;
memset(magic, 0xFF, 6);
for (i = 0; i < 16; i++)
{
memcpy(magic + size, mac, 6);
size += 6;
}
/* * create socket */
bzero((char *)&sin, sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_port = htons(9);
sin.sin_addr.s_addr = htonl(INADDR_BROADCAST);
if ((sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1)
{
fprintf(stderr, "failed to get socket, error(%d)\n", errno);
status = -1;
goto out;
}
int optval = 1;
if (setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &optval, sizeof(optval)) == -1)
{
fprintf(stderr, "failed to set sockopt, error(%d)\n", errno);
status = -2;
goto out;
}
/* * wake pc up */
if (sendto(sockfd, magic, size, 0, (struct sockaddr*)&sin, sizeof(sin)) == -1)
{
fprintf(stderr, "failed to send Magic packet, error(%d)\n", errno);
status = -3;
}
out:
close(sockfd);
return status;
}