不学网

 找回密码
 立即注册

只需一步,快速开始

手机号码,快捷登录

查看: 64|回复: 1

[c/c++] C/C++远程开机

[复制链接]
BiaoGe 发表于 2018-9-10 02:01:16 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
  1. // 2C:4D:54:ED:08:F0
  2. #include <stdio.h>
  3. #include <Windows.h>
  4. #include <winsock.h>

  5. #pragma comment(lib,"Ws2_32.lib")

  6. /*
  7.     从文件通过ip获取mac
  8.     ip:欲取ip的mac地址
  9.     成功返回对应mac,否则返回NULL.
  10. */
  11. unsigned char *GetfileMacforIp(char *ip);
  12. /*
  13.     远程唤醒
  14.     mac:目标mac地址
  15.     ps:在此之前要确保目标主板支持远程唤醒
  16. */
  17. VOID RemoteStart(unsigned char *mac);

  18. int main(void)
  19. {
  20.     unsigned char *mac = GetfileMacforIp("172.18.1.6");
  21.     if (mac)
  22.     {
  23.         printf("%X-%X-%X-%X-%X-%X\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
  24.         //free(mac); 为什么无法free?
  25.     }
  26.     system("pause");
  27.     return 0;
  28. }



  29. VOID RemoteStart(unsigned char *mac)
  30. {
  31.     // 存封包数据,格式为:6个0xFF为一组,16个mac地址为一组.mac地址正好是6个字节,封包总大小=6+16*6=102
  32.     unsigned char packet[102] = { 0 };
  33.     struct sockaddr_in addr;
  34.     int sockfd, i, j;
  35.     const char on = 1;
  36.     WSADATA aaa;

  37.     // 填充封包数据
  38.     for (i = 0; i < 6; i++)
  39.         packet[i] = 0xFF;
  40.     for (i = 1; i < 17; i++)
  41.     {
  42.         for (j = 0; j < 6; j++)
  43.         {
  44.             packet[i * 6 + j] = mac[j];
  45.         }
  46.     }
  47.     // 使用socket发送封包前必须初始化socket
  48.     WSAStartup(MAKEWORD(2, 2), &aaa);
  49.     // udp方式
  50.     sockfd = socket(AF_INET, SOCK_DGRAM, 0);
  51.     setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on));
  52.     if (sockfd < 0)
  53.     {
  54.         printf("setsockopt filed!\n");
  55.         return;
  56.     }
  57.     memset(&addr, 0, sizeof(addr));
  58.     addr.sin_family = AF_INET;
  59.     addr.sin_port = htons(10000);
  60.     // 广播地址:255.255.255.255
  61.     addr.sin_addr.S_un.S_addr = inet_addr("255.255.255.255");
  62.     sendto(sockfd, (const char *)packet, sizeof(packet), 0, (struct sockaddr *)&addr, sizeof(addr));
  63.     WSACleanup();
  64. }

  65. unsigned char *GetfileMacforIp(char *ip)
  66. {
  67.     char tmp[255] = { 0 };
  68.     char *pos = NULL;
  69.     char mac[20] = { 0 };
  70.     unsigned char *mac1 = (unsigned char*)malloc(sizeof(unsigned char)*6);
  71.     //unsigned char mac1[6] = { 0 };

  72.     FILE *wj = NULL;
  73.     fopen_s(&wj, "ipmac.txt", "r");
  74.     if (!wj)
  75.     {
  76.         printf("file can`t open!\n");
  77.         return 0;
  78.     }
  79.     while (!feof(wj))
  80.     {
  81.         memset(tmp, 0, 255);
  82.         fgets(tmp, 255, wj);
  83.         pos = strstr(tmp, ip);
  84.         if (pos)
  85.         {
  86.             // 文本形式Mac地址
  87.             memmove(mac, tmp + strlen(ip) + 1, 17);
  88.             // 转字节形式Mac地址
  89.             sscanf_s(mac, "%x-%x-%x-%x-%x-%x", &mac1[0], &mac1[1], &mac1[2], &mac1[3], &mac1[4], &mac1[5]);
  90.             //printf("%X %X %X %X %X %X\n",mac1[0],mac1[1],mac1[2],mac1[3],mac1[4],mac1[5]);
  91.             break;
  92.         }
  93.     }
  94.     fclose(wj);
  95.     return mac1;
  96. }
复制代码


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

使用道具 举报

 楼主| BiaoGe 发表于 2018-9-10 02:02:50 | 显示全部楼层
飞哥,帮忙看下为啥free那个指针不好使?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|不学网

GMT+8, 2018-9-19 04:59

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表