不学网

 找回密码
 立即注册

只需一步,快速开始

手机号码,快捷登录

查看: 142|回复: 1

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

[复制链接]
BiaoGe 发表于 2018-7-18 05:31:21 | 显示全部楼层 |阅读模式

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

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

x
本机名、IP、MAC都是一些比较常用网络参数,怎么用C/C++获取呢?
研究了两三个小时...
需要说明的都在代码注释里
  1. #include <stdio.h>
  2. #include <Windows.h>
  3. #include <IPHlpApi.h>

  4. #pragma comment(lib,"ws2_32.lib")        // Socket静态库,取本机IP用
  5. #pragma comment(lib,"IPHlpApi.lib")        // 发送ARP报文要用的静态库,取MAC用

  6. /*
  7.         取主机名
  8.         成功返回主机名,失败返回NULL.
  9. */
  10. char *MyGetHostName(void);

  11. /*
  12.         取本机IP
  13.         成功返回本机IP,失败返回NULL.
  14. */
  15. char *MyGetHostIp(void);

  16. /*
  17.         取本机MAC
  18.         成功返回本机MAC,失败返回NULL.
  19. */
  20. char *MyGetHostMac(void);

  21. int main(void)
  22. {
  23.         char *lpName = NULL;
  24.         char *lpIp = NULL;
  25.         char *lpMac = NULL;

  26.         lpName = MyGetHostName();
  27.         lpIp = MyGetHostIp();
  28.         lpMac = MyGetHostMac();
  29.         printf("PCName : %s\n", lpName);
  30.         printf("IPAddr : %s\n", lpIp);
  31.         printf("M A C  : %s\n", lpMac);
  32.        
  33.         free(lpName);
  34.         free(lpIp);
  35.         free(lpMac);
  36.         system("pause");
  37.         return 0;
  38. }

  39. char *MyGetHostName(void)
  40. {
  41.         char *lpName = NULL;
  42.         DWORD dwLen = 0;

  43.         GetComputerName(NULL, &dwLen);
  44.         lpName = (char *)malloc(dwLen);
  45.         memset(lpName, 0, dwLen);
  46.         GetComputerName(lpName, &dwLen);
  47.         return (lpName ? lpName : NULL);
  48. }

  49. char *MyGetHostIp(void)
  50. {
  51.         char *ip = NULL;
  52.         WSADATA wsaData = { 0 };
  53.         struct hostent *phostinfo = NULL;
  54.        
  55.         ip = (char *)malloc(sizeof(char)* 16);
  56.         memset(ip, 0, 16);
  57.         WSAStartup(MAKEWORD(2, 2), &wsaData);
  58.         phostinfo = gethostbyname("");
  59.         lstrcpyn(ip, inet_ntoa(*(struct in_addr *)(*phostinfo->h_addr_list)), 16);
  60.         WSACleanup();
  61.         if (ip)
  62.         {
  63.                 return ip;
  64.         }
  65.         else {
  66.                 free(ip);
  67.                 return NULL;
  68.         }
  69. }

  70. char *MyGetHostMac(void)
  71. {
  72.         IPAddr ip = inet_addr(MyGetHostIp());
  73.         PVOID *pMac = NULL;
  74.         ULONG MacAddr[2] = { 0 };        // Mac地址长度6字节
  75.         ULONG uMacSize = 6;
  76.        
  77.         // 通过ARP报文响应获取MAC地址
  78.         DWORD dwRet = SendARP(ip, 0, &MacAddr, &uMacSize);
  79.         if (dwRet == NO_ERROR)
  80.         {
  81.                 BYTE *bPhyAddr = (BYTE *)MacAddr;
  82.                
  83.                 if (uMacSize)
  84.                 {
  85.                         char *sMac = (char *)malloc(sizeof(char)* 18);
  86.                         int n = 0;

  87.                         memset(sMac, 0, 18);
  88.                         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]);
  89.                         return sMac;
  90.                 }
  91.                 else
  92.                 {
  93.                         printf("Mac地址获取失败!\n");
  94.                 }
  95.         }
  96.         else
  97.         {
  98.                 printf("ARP报文发送失败:%d\n",dwRet);
  99.         }
  100.         return NULL;
  101. }
复制代码
效果图:

回复

使用道具 举报

 楼主| BiaoGe 发表于 2018-7-22 23:03:40 | 显示全部楼层
请忽略图片的箭头,IP地址指到网关去了
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2018-8-18 10:42

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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