编程论坛

 找回密码
 立即注册
广告联系qq1031180668广告位
查看: 84|回复: 0

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

[复制链接]
  • ta_mind

    2018-8-17 21:57
  • classn_01: 71 classn_02

    [LV.6]常住居民II

    983

    主题

    1704

    帖子

    3353

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    3353

    最佳新人活跃会员热心会员推广达人宣传达人灌水之王突出贡献优秀版主荣誉管理论坛元老

    发表于 2018-9-11 20:12:49 | 显示全部楼层 |阅读模式
    核心函数是RemoteStart,GetfileMacforIp是我在本地存放的一个ip和mac地址的数据文件。
    [C++] syntaxhighlighter_viewsource syntaxhighlighter_copycode
    // 2C:4D:54:ED:08:F0
    #include <stdio.h>
    #include <Windows.h>
    #include <winsock.h>
    
    #pragma comment(lib,"Ws2_32.lib")
    
    /*
        从文件通过ip获取mac
        ip:欲取ip的mac地址
        成功返回对应mac,否则返回NULL.
    */
    unsigned char *GetfileMacforIp(char *ip);
    /*
        远程唤醒
        mac:目标mac地址
        ps:在此之前要确保目标主板支持远程唤醒
    */
    VOID RemoteStart(unsigned char *mac);
    
    int main(void)
    {
        unsigned char *mac = GetfileMacforIp("172.18.1.6");
        if (mac)
        {
            printf("%X-%X-%X-%X-%X-%X\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
            //free(mac); 为什么无法free?
        }
        system("pause");
        return 0;
    }
    
    
    
    VOID RemoteStart(unsigned char *mac)
    {
        // 存封包数据,格式为:6个0xFF为一组,16个mac地址为一组.mac地址正好是6个字节,封包总大小=6+16*6=102
        unsigned char packet[102] = { 0 };
        struct sockaddr_in addr;
        int sockfd, i, j;
        const char on = 1;
        WSADATA aaa;
    
        // 填充封包数据
        for (i = 0; i < 6; i++)
            packet[i] = 0xFF;
        for (i = 1; i < 17; i++)
        {
            for (j = 0; j < 6; j++)
            {
                packet[i * 6 + j] = mac[j];
            }
        }
        // 使用socket发送封包前必须初始化socket
        WSAStartup(MAKEWORD(2, 2), &aaa);
        // udp方式
        sockfd = socket(AF_INET, SOCK_DGRAM, 0);
        setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on));
        if (sockfd < 0)
        {
            printf("setsockopt filed!\n");
            return;
        }
        memset(&addr, 0, sizeof(addr));
        addr.sin_family = AF_INET;
        addr.sin_port = htons(10000);
        // 广播地址:255.255.255.255
        addr.sin_addr.S_un.S_addr = inet_addr("255.255.255.255");
        sendto(sockfd, (const char *)packet, sizeof(packet), 0, (struct sockaddr *)&addr, sizeof(addr));
        WSACleanup();
    }
    
    unsigned char *GetfileMacforIp(char *ip)
    {
        char tmp[255] = { 0 };
        char *pos = NULL;
        char mac[20] = { 0 };
        unsigned char *mac1 = (unsigned char*)malloc(sizeof(unsigned char)*6);
        //unsigned char mac1[6] = { 0 };
    
        FILE *wj = NULL;
        fopen_s(&wj, "ipmac.txt", "r");
        if (!wj)
        {
            printf("file can`t open!\n");
            return 0;
        }
        while (!feof(wj))
        {
            memset(tmp, 0, 255);
            fgets(tmp, 255, wj);
            pos = strstr(tmp, ip);
            if (pos)
            {
                // 文本形式Mac地址
                memmove(mac, tmp + strlen(ip) + 1, 17);
                // 转字节形式Mac地址
                sscanf_s(mac, "%x-%x-%x-%x-%x-%x", &mac1[0], &mac1[1], &mac1[2], &mac1[3], &mac1[4], &mac1[5]);
                //printf("%X %X %X %X %X %X\n",mac1[0],mac1[1],mac1[2],mac1[3],mac1[4],mac1[5]);
                break;
            }
        }
        fclose(wj);
        return mac1;
    }

    不积跬步,无以至千里
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    手机版|Archiver|小黑屋|sitemap|编程论坛 - 一个单纯的编程学习交流论坛 ( 豫ICP备15032706号 )

    GMT+8, 2018-10-21 01:39 , Processed in 1.085294 second(s), 24 queries .

    Powered by Discuz! X3.4

    © 2001-2013 Comsenz Inc.

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