• C/C++远程开机


      1 // 2C:4D:54:ED:08:F0
      2 #include <stdio.h>
      3 #include <Windows.h>
      4 #include <winsock.h>
      5 
      6 #pragma comment(lib,"Ws2_32.lib")
      7 
      8 /*
      9     从文件通过ip获取mac
     10     ip:欲取ip的mac地址
     11     成功返回对应mac,否则返回NULL.
     12 */
     13 unsigned char *GetfileMacforIp(char *ip);
     14 /*
     15     远程唤醒
     16     mac:目标mac地址
     17     ps:在此之前要确保目标主板支持远程唤醒
     18 */
     19 VOID RemoteStart(unsigned char *mac);
     20 
     21 int main(void)
     22 {
     23     unsigned char *mac = GetfileMacforIp("172.18.1.6");
     24     if (mac)
     25     {
     26         printf("%X-%X-%X-%X-%X-%X
    ", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
     27         //free(mac); 为什么无法free?
     28     }
     29     system("pause");
     30     return 0;
     31 }
     32 
     33 
     34 
     35 VOID RemoteStart(unsigned char *mac)
     36 {
     37     // 存封包数据,格式为:6个0xFF为一组,16个mac地址为一组.mac地址正好是6个字节,封包总大小=6+16*6=102
     38     unsigned char packet[102] = { 0 };
     39     struct sockaddr_in addr;
     40     int sockfd, i, j;
     41     const char on = 1;
     42     WSADATA aaa;
     43 
     44     // 填充封包数据
     45     for (i = 0; i < 6; i++)
     46         packet[i] = 0xFF;
     47     for (i = 1; i < 17; i++)
     48     {
     49         for (j = 0; j < 6; j++)
     50         {
     51             packet[i * 6 + j] = mac[j];
     52         }
     53     }
     54     // 使用socket发送封包前必须初始化socket
     55     WSAStartup(MAKEWORD(2, 2), &aaa);
     56     // udp方式
     57     sockfd = socket(AF_INET, SOCK_DGRAM, 0);
     58     setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on));
     59     if (sockfd < 0)
     60     {
     61         printf("setsockopt filed!
    ");
     62         return;
     63     }
     64     memset(&addr, 0, sizeof(addr));
     65     addr.sin_family = AF_INET;
     66     addr.sin_port = htons(10000);
     67     // 广播地址:255.255.255.255
     68     addr.sin_addr.S_un.S_addr = inet_addr("255.255.255.255");
     69     sendto(sockfd, (const char *)packet, sizeof(packet), 0, (struct sockaddr *)&addr, sizeof(addr));
     70     WSACleanup();
     71 }
     72 
     73 unsigned char *GetfileMacforIp(char *ip)
     74 {
     75     char tmp[255] = { 0 };
     76     char *pos = NULL;
     77     char mac[20] = { 0 };
     78     unsigned char *mac1 = (unsigned char*)malloc(sizeof(unsigned char)*6);
     79     //unsigned char mac1[6] = { 0 };
     80 
     81     FILE *wj = NULL;
     82     fopen_s(&wj, "ipmac.txt", "r");
     83     if (!wj)
     84     {
     85         printf("file can`t open!
    ");
     86         return 0;
     87     }
     88     while (!feof(wj))
     89     {
     90         memset(tmp, 0, 255);
     91         fgets(tmp, 255, wj);
     92         pos = strstr(tmp, ip);
     93         if (pos)
     94         {
     95             // 文本形式Mac地址
     96             memmove(mac, tmp + strlen(ip) + 1, 17);
     97             // 转字节形式Mac地址
     98             sscanf_s(mac, "%x-%x-%x-%x-%x-%x", &mac1[0], &mac1[1], &mac1[2], &mac1[3], &mac1[4], &mac1[5]);
     99             //printf("%X %X %X %X %X %X
    ",mac1[0],mac1[1],mac1[2],mac1[3],mac1[4],mac1[5]);
    100             break;
    101         }
    102     }
    103     fclose(wj);
    104     return mac1;
    105 }

    核心函数是RemoteStart,GetfileMacforIp是我在本地存放的一个ip和mac地址的数据文件。

  • 相关阅读:
    win10通过ip连接打印机
    tarunexpectedeofinarchive
    软件工程设计阶段的几种图
    代码review checklist
    caffeine的使用
    thetrustanchorsparametermustbenonempty
    mysql explain type的详解
    scp对拷贝文件夹
    虚拟dom与diff算法
    线程池ThreadPoolExecutor的使用
  • 原文地址:https://www.cnblogs.com/biaoge140/p/9613584.html
Copyright © 2020-2023  润新知