立即注册

编程论坛

广告联系qq1031180668广告位
查看: 310|回复: 1

[c/c++] C/C++获取本机名+本机IP+本机MAC

[复制链接]
  • ta_mind
    擦汗
    2019-3-27 07:25
  • classn_01: 72 classn_02

    [LV.6]常住居民II

    1021

    主题

    1742

    帖子

    3558

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    3558

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

    发表于 2018-7-23 21:38:00 | 显示全部楼层 |阅读模式
    本机名、IP、MAC都是一些比较常用网络参数,怎么用C/C++获取呢?
    研究了两三个小时...
    需要说明的都在代码注释里
    [C++] syntaxhighlighter_viewsource syntaxhighlighter_copycode
    #include <stdio.h>
    #include <Windows.h>
    #include <IPHlpApi.h>
    
    #pragma comment(lib,"ws2_32.lib")        // Socket静态库,取本机IP用
    #pragma comment(lib,"IPHlpApi.lib")        // 发送ARP报文要用的静态库,取MAC用
    
    /*
            取主机名
            成功返回主机名,失败返回NULL.
    */
    char *MyGetHostName(void);
    
    /*
            取本机IP
            成功返回本机IP,失败返回NULL.
    */
    char *MyGetHostIp(void);
    
    /*
            取本机MAC
            成功返回本机MAC,失败返回NULL.
    */
    char *MyGetHostMac(void);
    
    int main(void)
    {
            char *lpName = NULL;
            char *lpIp = NULL;
            char *lpMac = NULL;
    
            lpName = MyGetHostName();
            lpIp = MyGetHostIp();
            lpMac = MyGetHostMac();
            printf("PCName : %s\n", lpName);
            printf("IPAddr : %s\n", lpIp);
            printf("M A C  : %s\n", lpMac);
            
            free(lpName);
            free(lpIp);
            free(lpMac);
            system("pause");
            return 0;
    }
    
    char *MyGetHostName(void)
    {
            char *lpName = NULL;
            DWORD dwLen = 0;
    
            GetComputerName(NULL, &dwLen);
            lpName = (char *)malloc(dwLen);
            memset(lpName, 0, dwLen);
            GetComputerName(lpName, &dwLen);
            return (lpName ? lpName : NULL);
    }
    
    char *MyGetHostIp(void)
    {
            char *ip = NULL;
            WSADATA wsaData = { 0 };
            struct hostent *phostinfo = NULL;
            
            ip = (char *)malloc(sizeof(char)* 16);
            memset(ip, 0, 16);
            WSAStartup(MAKEWORD(2, 2), &wsaData);
            phostinfo = gethostbyname("");
            lstrcpyn(ip, inet_ntoa(*(struct in_addr *)(*phostinfo->h_addr_list)), 16);
            WSACleanup();
            if (ip)
            {
                    return ip;
            }
            else {
                    free(ip);
                    return NULL;
            }
    }
    
    char *MyGetHostMac(void)
    {
            IPAddr ip = inet_addr(MyGetHostIp());
            PVOID *pMac = NULL;
            ULONG MacAddr[2] = { 0 };        // Mac地址长度6字节
            ULONG uMacSize = 6;
            
            // 通过ARP报文响应获取MAC地址
            DWORD dwRet = SendARP(ip, 0, &MacAddr, &uMacSize);
            if (dwRet == NO_ERROR)
            {
                    BYTE *bPhyAddr = (BYTE *)MacAddr;
                    
                    if (uMacSize)
                    {
                            char *sMac = (char *)malloc(sizeof(char)* 18);
                            int n = 0;
    
                            memset(sMac, 0, 18);
                            sprintf_s(sMac, (size_t)18, "%.2X-%.2X-%.2X-%.2X-%.2X-%.2X", (int)bPhyAddr[0], (int)bPhyAddr[1], (int)bPhyAddr[2], (int)bPhyAddr[3], (int)bPhyAddr[4], (int)bPhyAddr[5]);
                            return sMac;
                    }
                    else
                    {
                            printf("Mac地址获取失败!\n");
                    }
            }
            else
            {
                    printf("ARP报文发送失败:%d\n",dwRet);
            }
            return NULL;
    }

    C/C++获取本机名+本机IP+本机MAC

    C/C++获取本机名+本机IP+本机MAC


    不积跬步,无以至千里

    classn_11

    0

    主题

    42

    帖子

    88

    积分

    注册会员

    Rank: 2

    积分
    88
    发表于 2018-8-13 14:43:34 | 显示全部楼层
    回复

    使用道具 举报

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

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

    GMT+8, 2019-7-21 18:50 , Processed in 1.099412 second(s), 27 queries .

    Powered by Discuz! X3.4

    © 2001-2013 Comsenz Inc.

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