VC获取IP地址和MAC地址程序(转载)

VC获取IP地址和MAC地址程序(转载)

分类: VC 网络编程 C/C++   6381人阅读  评论(1)  收藏  举报

 

[cpp]  view plain copy
  1. #include <winsock2.h> //该头文件定义了Socket编程的功能  
  2. #include <stdio.h>    //该头文件声明了输入输出流函数  
  3. #include <stdlib.h>   //该头文件定义了一些通用函数  
  4. #include <httpext.h>   //该头文件支持HTTP请求  
  5. #include <windef.h>   //该头文件定义了Windows的所有数据基本型态  
  6. #include <Nb30.h>   //该头文件声明了netbios的所有的函数   
  7. #pragma comment(lib,"ws2_32.lib")    //连接ws2_32.lib库.只要程序中用到Winsock API 函数,都要用到 Ws2_32.lib  
  8. #pragma comment(lib,"netapi32.lib")   //连接Netapi32.lib库,MAC获取中用到了NetApi32.DLL的功能  
  9.   
  10. //在Win32平台上的Winsock编程都要经过下列的基本步骤:定义变量->获得Winsock版本->加载Winsock库->  
  11. //初始化->创建套接字->设置套接字选项->关闭套接字->卸载Winsock库,释放所有资源。  
  12. void CheckIP(void)    //定义checkIP函数,用于取本机的ip地址  
  13. {  
  14.     WSADATA wsaData;  
  15.     char name[155];      //定义用于存放获得主机名的变量  
  16.     char *ip;            //定义IP地址变量  
  17.     PHOSTENT hostinfo;   
  18.   
  19.     //调用MAKEWORD()获得Winsocl版本的正确值,用于下面的加载Winscok库  
  20.     if ( WSAStartup( MAKEWORD(2,0), &wsaData ) == 0 )   
  21.     {   //加载Winsock库,如果WSAStartup()函数返回值为0,说明加载成功,程序可以继续往下执行  
  22.         if( gethostname ( name, sizeof(name)) == 0)   
  23.         { //如果成功,将本地主机名存放入由name参数指定的缓冲区中  
  24.             if((hostinfo = gethostbyname(name)) != NULL)   
  25.             { //这是获取主机,如果获得主机名成功的话,将返回一个指针,指向hostinfo,hostinfo为PHOSTENT型的变量。  
  26.                 ip = inet_ntoa (*(struct in_addr *)*hostinfo->h_addr_list);   
  27.                 //inet_addr()函数把地址串转换为IP地址  
  28.                 //调用inet_ntoa()函数,将hostinfo结构变量中的h_addr_list转化为标准的IP地址(如202.197.11.12.)  
  29.                 printf(" IP地址: %s/n",ip);        //输出IP地址  
  30.             }   
  31.         }   
  32.         WSACleanup( );         //卸载Winsock库,并释放所有资源  
  33.     }   
  34. }  
  35.   
  36. //通过WindowsNT/Win2000中内置的NetApi32.DLL的功能来实现的。首先通过发送NCBENUM命令,获取网卡的  
  37. //数目和每张网卡的内部编号,然后对每个网卡标号发送NCBASTAT命令获取其MAC地址。  
  38. int getMAC(char * mac)     //用NetAPI来获取网卡MAC地址  
  39. {       
  40.     NCB ncb;     //定义一个NCB(网络控制块)类型的结构体变量ncb  
  41.     typedef struct _ASTAT_     //自定义一个结构体_ASTAT_  
  42.     {  
  43.         ADAPTER_STATUS   adapt;   
  44.         NAME_BUFFER   NameBuff   [30];       
  45.     }ASTAT, *PASTAT;  
  46.     ASTAT Adapter;     
  47.   
  48.     typedef struct _LANA_ENUM     //自定义一个结构体_ASTAT_  
  49.     {  
  50.         UCHAR length;   
  51.         UCHAR lana[MAX_LANA];     //存放网卡MAC地址   
  52.     }LANA_ENUM;       
  53.     LANA_ENUM lana_enum;     
  54.   
  55.     //   取得网卡信息列表       
  56.     UCHAR uRetCode;       
  57.     memset(&ncb, 0, sizeof(ncb));     //将已开辟内存空间ncb 的值均设为值 0  
  58.     memset(&lana_enum, 0, sizeof(lana_enum));     //清空一个结构类型的变量lana_enum,赋值为0  
  59.     //对结构体变量ncb赋值  
  60.     ncb.ncb_command = NCBENUM;     //统计系统中网卡的数量  
  61.     ncb.ncb_buffer = (unsigned char *)&lana_enum; //ncb_buffer成员指向由LANA_ENUM结构填充的缓冲区  
  62.     ncb.ncb_length = sizeof(LANA_ENUM);     
  63.     //向网卡发送NCBENUM命令,以获取当前机器的网卡信息,如有多少个网卡,每个网卡的编号(MAC地址)   
  64.     uRetCode = Netbios(&ncb); //调用netbois(ncb)获取网卡序列号      
  65.     if(uRetCode != NRC_GOODRET)       
  66.     return uRetCode;       
  67.   
  68.     //对每一个网卡,以其网卡编号为输入编号,获取其MAC地址     
  69.     for(int lana=0; lana<lana_enum.length; lana++)       
  70.     {  
  71.         ncb.ncb_command = NCBRESET;   //对网卡发送NCBRESET命令,进行初始化  
  72.         ncb.ncb_lana_num = lana_enum.lana[lana];   
  73.         uRetCode = Netbios(&ncb);     
  74.     }   
  75.     if(uRetCode != NRC_GOODRET)  
  76.     return uRetCode;       
  77.       
  78.     //   准备取得接口卡的状态块取得MAC地址  
  79.     memset(&ncb, 0, sizeof(ncb));   
  80.     ncb.ncb_command = NCBASTAT;    //对网卡发送NCBSTAT命令,获取网卡信息  
  81.     ncb.ncb_lana_num = lana_enum.lana[0];     //指定网卡号,这里仅仅指定第一块网卡,通常为有线网卡   
  82.     strcpy((char*)ncb.ncb_callname, "*");     //远程系统名赋值为*  
  83.     ncb.ncb_buffer = (unsigned char *)&Adapter; //指定返回的信息存放的变量  
  84.     ncb.ncb_length = sizeof(Adapter);  
  85.     //接着发送NCBASTAT命令以获取网卡的信息  
  86.     uRetCode = Netbios(&ncb);   
  87.     //   取得网卡的信息,并且如果网卡正常工作的话,返回标准的冒号分隔格式。     
  88.     if(uRetCode != NRC_GOODRET)     
  89.     return uRetCode;     
  90.     //把网卡MAC地址格式转化为常用的16进制形式,输出到字符串mac中   
  91.     sprintf(mac,"%02X-%02X-%02X-%02X-%02X-%02X",       
  92.     Adapter.adapt.adapter_address[0],       
  93.     Adapter.adapt.adapter_address[1],       
  94.     Adapter.adapt.adapter_address[2],       
  95.     Adapter.adapt.adapter_address[3],       
  96.     Adapter.adapt.adapter_address[4],       
  97.     Adapter.adapt.adapter_address[5]   
  98.     );   
  99.     return 0;     
  100. }  
  101.   
  102. int main(void)   //主函数,程序的入口     
  103. {  
  104.     CheckIP();       //调用CheckIP()函数获得,输出IP地址  
  105.     char   mac[200];     
  106.     getMAC(mac);   //调用getMAC()函数获得,输出MAC地址  
  107.     printf(" mac地址 : %s /n",mac);     
  108.     return 0;  
  109. }  

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值