VC下获得网卡MAC,IP等信息的最简单方法

 

今天闲着无聊就想来做点试验,于是想到获得网卡的一些信息,开始网上狂搜,找到的方法都很麻烦,后来在一个Delphi技术网站发现一个简单方法,于是我将他代码翻译了一下,加入了一些其他的功能(他程序主要是获得MAC).下面详细介绍下方法.

获得MAC:

网上很多都是获得网卡信息然后在获得MAC,或者从注册表里读,不过这里介绍一个简单的方法

用到一个API
RPC_STATUS RPC_ENTRY UuidCreateSequential(UUID* Uuid);
这个API可以获得MAC地址 
他返回信息如下 
RPC_S_OK                                    The call succeeded. 
RPC_S_UUID_LOCAL_ONLY           The UUID is guaranteed to be unique to this computer only. 
RPC_S_UUID_NO_ADDRESS          Cannot get Ethernet or token-ring hardware address for this computer. 
正常返回是第一个 

所以我们用下面的代码获得到MAC地址

 long rt;  
 UUID ui;
  char mac[6][10]={0};
  CString temp;
  CString Mac;
  rt = UuidCreateSequential(&ui);
  if (rt == RPC_S_OK)
  {
        _itoa(ui.Data4[2],mac[0],16);
       _itoa(ui.Data4[3],mac[1],16);
       _itoa(ui.Data4[4],mac[2],16);
       _itoa(ui.Data4[5],mac[3],16);
       _itoa(ui.Data4[6],mac[4],16);
       _itoa(ui.Data4[7],mac[5],16);
  }
  for(int n=0;n<6;n++)
  {
       if (strlen(mac[n]) == 1)
       {
            temp.Format("0%s",mac[n]);
            strcpy(mac[n],temp);
       }
  }
  Mac.Format("%s.%s.%s.%s.%s.%s",mac[0],mac[1],mac[2],mac[3],mac[4],mac[5]);
  SetDlgItemText(IDC_EDIT1,Mac);
 

这样就完成了第一个获得到MAC地址,至于为什么要循环一次是因为转成16进制以后是一位比如

0.0.0.0.0.0

但是MAC地址一般是16进制,所以是00所以加个0而已

00.00.00.00.00.00

下面是获得IP和主机名

 char name[255]={0};
  CString ip;
 hostent *addr;
  ::AfxSocketInit();
   if(gethostname(name,sizeof(name))==0)
   {
        if((addr=gethostbyname(name)) != NULL)
        {
             ip = inet_ntoa(*(in_addr*)*addr->h_addr_list);
        }
   }
  SetDlgItemText(IDC_EDIT2,name);
  SetDlgItemText(IDC_IPADDRESS1,ip);
 

这个原理很简单先获得主机名,然后通过主机名获得到对应的IP.
需要注意的是,开始需要引用
#i nclude <afxsock.h>
这样才可以正常获得主机名,
至于MAC需要使用到
Rpcrt4.dll
这个文件(系统目录下)
所以需要引用库和头文件
#i nclude "Rpcdce.h" 
#pragma comment(lib,"Rpcrt4.lib")
 
这样这个最简单的获得MAC和IP以及主机名的程序就完成了.

///  
  ///   This   one   works   well   if   you   only   have   one   NIC  
  CString   CFormatHtmNameView::GetMACAddr()  
  {  
          CString   strReturn;  
          GUID   uuid;  
                  //   In   Win2k   or   higher,   CoCreateGuid   no   longer   returns   a   mac   address,   but   UuidCreate  
                  //   Sequential   does.    
          typedef   RPC_STATUS   (CALLBACK*   UuidCreateSequential_t)(UUID*);      
          //   This   doesnt   exist   Pre   win2k,  
                  //   in   that   case   it   uses   CoCreateGuid   (which   will   fail   in   2k+)   -   mc          
          HMODULE   hRpcrt4   =   LoadLibrary("rpcrt4.dll");           //   Attempt   to   load   RPCRT4.DLL            
                  if(hRpcrt4)  
          {  
                  UuidCreateSequential_t   fpUuidCreateSequential;  
                  fpUuidCreateSequential   =   (UuidCreateSequential_t)  
                                                                                      GetProcAddress(hRpcrt4,   "UuidCreateSequential");  
                                  //   Attempt   dynamic   load   of   UuidCreateSequential   c  
                  if(fpUuidCreateSequential)  
                  {                          
                          //   Create   Sequential   UUID   for   determination   of   MAC   Address    
                          fpUuidCreateSequential(&uuid);  
                  }  
                  else  
                  {       //   OS   Doesnt   support   UuidCreateSequential,   so   fall   back   on   CoCreateGuid  
                              CoCreateGuid(&uuid);  
                  }  
                  FreeLibrary(hRpcrt4);  
          }  
          else  
          {   //   OS   Doesnt   support   UuidCreateSequential,   so   fall   back   on   CoCreateGuid            
                                CoCreateGuid(&uuid);  
          }  
   
          //   Now   Format   The   adapter   address   -   mc  
          strReturn.Format("%2.2X-%2.2X-%2.2X-%2.2X-%2.2X-%2.2X",  
                          uuid.Data4[2],  
                          uuid.Data4[3],  
                          uuid.Data4[4],  
                          uuid.Data4[5],  
                          uuid.Data4[6],  
                          uuid.Data4[7]);          
          return   strReturn;  
  }  
 


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值