CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

怎样读取网卡的MAC地址?

楼主JWhiteHorse()2002-01-29 18:03:32 在 VC/MFC / 基础类 提问

问题点数:98、回复次数:4Top

1 楼Jneu(沧海桑田)回复于 2002-01-29 18:13:55 得分 98

#include   “stdafx.h"  
   
    #include    
    #include    
    #include    
    #include    
    #include    
   
  //   因   为   是   通   过NetAPI   来   获   取   网   卡   信   息,  
    所   以   需   要   包   含   其   题   头   文   件nb30.h  
    #include    
   
  typedef   struct   _ASTAT_  
  {  
          ADAPTER_STATUS   adapt;  
          NAME_BUFFER         NameBuff   [30];  
  }ASTAT,   *   PASTAT;  
   
  ASTAT   Adapter;  
  //   定   义   一   个   存   放   返   回   网   卡   信   息   的   变   量  
   
  //   输   入   参   数:lana_num   为   网   卡   编   号,  
    一   般   地,   从0   开   始,   但   在Windows   2000   中  
    并   不   一   定   是   连   续   分   配   的  
  void   getmac_one   (int   lana_num)  
  {  
          NCB   ncb;  
          UCHAR   uRetCode;  
   
          memset(   &ncb,   0,   sizeof(ncb)   );  
          ncb.ncb_command   =   NCBRESET;  
  ncb.ncb_lana_num   =   lana_num;          
  //   指   定   网   卡   号  
   
  //   首   先   对   选   定   的   网   卡   发   送   一   个  
  NCBRESET   命   令,   以   便   进   行   初   始   化  
          uRetCode   =   Netbios(   &ncb   );  
  printf(   “The   NCBRESET    
  return   code   is:   0x   %x   \n",   uRetCode   );  
   
          memset(   &ncb,   0,   sizeof(ncb)   );  
          ncb.ncb_command   =   NCBASTAT;  
          ncb.ncb_lana_num   =   lana_num;       //   指   定   网   卡   号  
   
  strcpy((char   *)ncb.ncb_callname,“   *             "   );        
  ncb.ncb_buffer   =   (unsigned   char   *)   &Adapter;              
  //   指   定   返   回   的   信   息   存   放   的   变   量  
          ncb.ncb_length   =   sizeof(Adapter);  
   
  //   接   着,   可   以   发   送NCBASTAT   命   令  
    以   获   取   网   卡   的   信   息  
          uRetCode   =   Netbios(   &ncb   );  
  printf(   “The   NCBASTAT   return   code   is:  
    0x   %x   \n",   uRetCode   );  
          if   (   uRetCode   ==   0   )  
          {  
                  //   把   网   卡MAC   地   址   格   式   化     成    
    常   用   的16   进   制   形   式,   如0010   -A4E4   -5802  
  printf(   “The   Ethernet   Number[   %d]   is:  
    %02X   %02X   -   %02X   %02X   -   %02X   %02X\n",  
                          lana_num,  
                          Adapter.adapt.adapter_address[0],  
                          Adapter.adapt.adapter_address[1],  
                          Adapter.adapt.adapter_address[2],  
                          Adapter.adapt.adapter_address[3],  
                        Adapter.adapt.adapter_address[4],  
                        Adapter.adapt.adapter_address[5]   );  
          }  
  }  
   
  int   main(int   argc,   char   *   argv[])    
  {  
          NCB   ncb;  
          UCHAR   uRetCode;  
          LANA_ENUM   lana_enum;  
   
          memset(   &ncb,   0,   sizeof(ncb)   );  
          ncb.ncb_command   =   NCBENUM;  
   
          ncb.ncb_buffer   =   (unsigned   char   *)   &lana_enum;  
          ncb.ncb_length   =   sizeof(lana_enum);  
   
        //   向   网   卡   发   送NCBENUM   命   令,  
        以   获   取   当   前   机   器   的   网   卡   信   息,  
        如   有   多   少   个   网   卡、   每   张   网   卡   的   编   号   等  
          uRetCode   =   Netbios(   &ncb   );  
  printf(   “The   NCBENUM   return   code   is:    
            0x   %x   \n",   uRetCode   );  
                if   (   uRetCode   ==   0   )  
                {  
                printf(   “Ethernet   Count   is   :   %d\n\n",   lana_enum.length);  
   
                //   对   每   一   张   网   卡,   以   其   网   卡   编   号   为    
                    输   入   编   号,   获   取   其MAC   地   址  
              Top

2 楼wwwsq(wwwsq)回复于 2002-01-29 18:43:15 得分 0

这是msdn上的标准示例演变出来的简化版  
  用这个方法可以获得所有网卡上的mac地址  
  in   .h:  
  #include   <Wsnwlink.h> //   about   ipx  
  #include   "wsipx.h"  
  sockaddr_ipx   m_ipxAddr;  
   
  in   .cpp:  
  //获得本机IPX地址  
  SOCKET                   s;  
  SOCKADDR_IPX       Addr;  
  int   res   =   0,   cbOpt     =   0,   cbAddr   =   sizeof(SOCKADDR_IPX);  
  s   =   socket(   AF_IPX,   SOCK_DGRAM,   NSPROTO_IPX   );  
  if(s==INVALID_SOCKET)  
  printf("Error:   %u\n",   WSAGetLastError());  
  memset(   &Addr,   0,   sizeof(   Addr   ));  
  Addr.sa_family   =   AF_IPX;  
  res   =   bind(   s,   (SOCKADDR*)   &Addr,   cbAddr);  
  if(res   !=   0)  
  {  
  printf("Error:   %u\n",   WSAGetLastError());  
  closesocket(s);  
  return;  
  }  
  IPX_ADDRESS_DATA     IpxData;  
  memset(   &IpxData,   0,   sizeof(IpxData));  
  IpxData.adapternum   =   0; //   只监听第一块网卡  
  cbOpt   =   sizeof(   IpxData   );  
  if((res   =   getsockopt(   s,   NSPROTO_IPX,   IPX_ADDRESS,   (char*)   &IpxData,   &cbOpt))   !=   0)  
  {  
  printf("Error:   %u\n",   WSAGetLastError());  
  closesocket(s);  
  return;  
  }  
  this->m_ipxAddr.sa_family   =   AF_IPX;  
  memcpy(this->m_ipxAddr.sa_netnum,   IpxData.netnum,   sizeof(IpxData.netnum));  
  memcpy(this->m_ipxAddr.sa_nodenum,   IpxData.nodenum,   sizeof(IpxData.nodenum));  
  this->m_ipxAddr.sa_socket   =   14555;  
  closesocket(s);  
  Top

3 楼wwwsq(wwwsq)回复于 2002-01-29 18:47:06 得分 0

还有一个类似的方法,可以调用getsockname得到mac地址,更简单  
  SOCKET   SrvSock;  
  PSOCKADDR_IPX   pSockAddr;  
  struct   sockaddr   addr;  
  SrvSock   =   socket(AF_IPX,                   //   IPX   Family  
                                            SOCK_SEQPACKET,   //   Gives   message   mode   transfers  
                                            NSPROTO_SPX);       //   SPX   is   connection   oriented   transport  
          if(SrvSock   ==   INVALID_SOCKET)    
  {  
                  return   FALSE;  
          }  
  memset(&addr,   0,   sizeof(addr));         //   Clear   address  
          pSockAddr   =   (PSOCKADDR_IPX)&addr;     //   Set   pointer  
          pSockAddr->sa_family   =   AF_IPX;    
  if(bind(SrvSock,   (PSOCKADDR)   pSockAddr,   sizeof(SOCKADDR_IPX))   ==   SOCKET_ERROR)  
          {  
                  return   FALSE;  
          }  
  int   addrlen   =   sizeof(addr);  
  if(getsockname(SrvSock,&addr,&addrlen)   ==   SOCKET_ERROR)  
          {  
                  return   FALSE;  
          }  
        memcpy(g_netnum,   addr.sa_data,     sizeof(g_netnum));  
  memcpy(g_netnod,   addr.sa_data   +   sizeof(g_netnum),   sizeof(g_netnod));  
  Top

4 楼kissfire(kissfire)回复于 2002-01-30 22:01:25 得分 0

iseeTop

相关问题

  • 怎样读取网卡的mac地址?
  • 用vb怎么读取多网卡mac地址阿?
  • 我是新手,求教,如果根据IP地址读取网卡的MAC值?
  • 怎么读取到网络上的任一台机器的网卡的MAC地址?
  • asp.net读取mac地址
  • 关于获取网卡的MAC地址
  • 如何查网卡的MAC地址
  • 如何获取网卡地址(mac)?
  • 关于网卡的MAC地址
  • 如何得到网卡的MAC地址??

关键词

  • .net
  • sa
  • socket
  • ipxdata
  • ncb
  • ipx
  • ipxaddr
  • lana
  • cbopt
  • netnum

得分解答快速导航

  • 帖主:JWhiteHorse
  • Jneu

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo