通过网卡远程开启PC

来源:互联网 发布:全民飞机大战冲刺算法 编辑:程序博客网 时间:2024/06/06 05:12


以下是代码实现部分,部分功能函数没有给出,可以自己实现。

一:总的说来,读取配置 .pclist 获取mac地址。

内容格式如下: 

macaddr  pc_name

6c:0b:84:68:17:10   ubuntu3

二:获取socket并设置它的属性

三:设置并发送magic包

备注:运行这个程序后,可能PC会堵塞,原因是要设置PC的BIOS使其支持通过网卡启动PC。


int main(int argc, char *argv[]){
    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;
}


0 0