CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  网络编程

===如何获得当前"使用的"MAC地址===

楼主mikeyangoo(找一条属于自己的路)2005-08-01 17:55:49 在 VC/MFC / 网络编程 提问

如何获得当前"使用的"MAC地址?  
  网上有很多方法能够获得MAC地址,但是我现在想要的如果多张网卡,插在机器上,那么当前系统使用的是哪个?  
  急~~~  
  问题点数:100、回复次数:15Top

1 楼newbiestar()回复于 2005-08-01 17:58:58 得分 0

每一块网卡对应一个,这还要说么?有几块网卡在被使用就有几个MAC地址(可能相同,不过一般不同)Top

2 楼mikeyangoo(找一条属于自己的路)回复于 2005-08-01 18:04:43 得分 0

我已经常识过GetAdaptersInfo   能够获取到所有的MAC地址,但是无法确定当前用哪个?Top

3 楼newbiestar()回复于 2005-08-01 18:11:59 得分 0

什么叫当前用哪个?给个明确的定义先?Top

4 楼mikeyangoo(找一条属于自己的路)回复于 2005-08-01 18:18:36 得分 0

就是当前是使用哪块网卡.在进行通讯的Top

5 楼mikeyangoo(找一条属于自己的路)回复于 2005-08-01 18:20:28 得分 0

比如我有   00-00-00-00-00-01,和00-00-00-00-00-02,都被系统标识,但是00-00-00-00-00-02卡没有插网线,始终在用00-00-00-00-00-01上网,我的需求就是想知道当前在用哪个?Top

6 楼CodeKey()回复于 2005-08-01 18:31:30 得分 0

arp   -a   中就可看到ip地址和网卡地址的对应关系  
   
  如果可以获得这条命令的结果,那就好办了  
   
  当然你也可以自己来写这个"arp"   命令,  
   
  我不会了   ...Top

7 楼newbiestar()回复于 2005-08-01 18:36:06 得分 0

没有插网线的网卡实际上是没有IP地址的  
   
  另外,你给“当前使用”下的定义还是不太准确……如果在你的程序里面有socket通讯的话,可以通过getsockname得到你当前使用的IP地址,然后和GetAdaptersInfo得到的信息进行比较,如果找到这个IP地址,那么你使用的就是这块网卡Top

8 楼newbiestar()回复于 2005-08-01 18:36:28 得分 0

arp   -a只能看到别人的,看不到自己的……Top

9 楼tangrh(阿唐)回复于 2005-08-02 08:48:16 得分 100

用getsockname获得ip,再用sendarp就可以获得macTop

10 楼tangrh(阿唐)回复于 2005-08-02 09:09:00 得分 0

不过sendarp在98下不可用,不晓得哪位有更舒服的方法Top

11 楼df8327(DF)回复于 2005-08-02 11:38:27 得分 0

不懂你说的意思  
  获得其他机器的MAC可以用SENDARP  
  获得本机的可以GetAdaptersInfo  
  而且我记得GetAdaptersInfo中可以找到所有适配器的信息  
  Top

12 楼tangrh(阿唐)回复于 2005-08-02 14:06:28 得分 0

本机同样可以用sendarp,因为这个是一个广播,当然自己可以收到,我现在用GetAdaptersInfo也处理了,其实差不多,它信息更多,只不过我自己觉得SendArp绝对简洁罢了Top

13 楼luibaiyi(毛豆)回复于 2005-08-02 15:08:51 得分 0

#include   <windows.h>  
  #include   <stdio.h>  
  #include   <tchar.h>  
  #include   <iphlpapi.h>  
       
  #pragma   comment(lib,"ws2_32.lib")  
  #pragma   comment(lib,"IpHlpApi.lib")  
   
  int   _cdecl   main()  
  {  
  HRESULT   hr;  
  IPAddr   ipAddr;  
  ULONG   pulMac[2];  
  ULONG   ulLen;  
   
  ipAddr   =   inet_addr("192.168.7.214");  
  memset(pulMac,   0xff,   sizeof(pulMac));  
  ulLen   =6;  
   
  hr   =   SendARP(ipAddr,   0,   pulMac,   &ulLen);  
  printf("Return   %08x,   length   %8d\n",   hr,   ulLen);  
   
  size_t   i,j;  
  char   *   szMac   =   new   char[ulLen*3];  
  PBYTE   pbHexMac   =   (PBYTE)   pulMac;  
  //  
  //Convert   the   binary   MAC   address   into   human-readable  
  //  
  for(i   =0   ,j=0;   i   <   ulLen   -1;   i++   ){  
    j   +=   sprintf(szMac   +j,"%02x:",   pbHexMac[i]);  
   
  }  
  sprintf(szMac   +j,   "%02x",   pbHexMac[i]);  
  printf("Mac   address   %s\n",   szMac);  
  delete   []szMac;  
  return   0;  
   
  }Top

14 楼df8327(DF)回复于 2005-10-15 12:18:40 得分 0

#ifndef   GET_MAC  
  #define   GET_MAC  
  #include   <winsock.h>  
  #pragma   comment(lib,"Netapi32")    
  typedef   struct   tagASTAT    
  {    
          ADAPTER_STATUS   adapt;    
          NAME_BUFFER         NameBuff   [30];    
  }ASTAT,*LPASTAT;    
  class   get_mac  
  {  
  public:  
  get_mac()  
  {  
  this->success=false;  
  this->getmac();  
  }  
  ~get_mac()  
  {  
  }  
  bool   return_mac(BYTE   *MAC_buffer)//参数指针指向的位置必须已经分配空间了  
  {  
  memcpy((void*)   MAC_buffer,(const   void   *)MacAddr,6);  
  return   this->success;  
  }  
   
  private:  
  bool   success;  
  BYTE       MacAddr[6];  
  UCHAR   GetAddressByIndex(int   lana_num,ASTAT   &   Adapter)    
  {    
  NCB   ncb;    
  UCHAR   uRetCode;    
  memset(&ncb,   0,   sizeof(ncb)   );    
  ncb.ncb_command   =   NCBRESET;    
  ncb.ncb_lana_num   =   lana_num;    
  uRetCode   =   Netbios(&ncb   );    
  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);      
  uRetCode   =   Netbios(&ncb   );    
  return   uRetCode;  
  }    
  void   getmac()  
  {  
   
  NCB   ncb;    
  UCHAR   uRetCode;  
  int   num   =   0;  
  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);    
  uRetCode   =   Netbios(&ncb);  
  if   (uRetCode   ==   0)    
  {  
  ASTAT   Adapter;  
  if(GetAddressByIndex(lana_enum.lana[0],Adapter)   ==   0)  
  {  
  success=true;  
  MacAddr[0]     =   Adapter.adapt.adapter_address[0];  
  MacAddr[1]     =   Adapter.adapt.adapter_address[1];  
  MacAddr[2]     =   Adapter.adapt.adapter_address[2];  
  MacAddr[3]     =   Adapter.adapt.adapter_address[3];  
  MacAddr[4]     =   Adapter.adapt.adapter_address[4];  
  MacAddr[5]     =   Adapter.adapt.adapter_address[5];  
  }  
   
  }  
   
  }  
  };  
  #endifTop

15 楼df8327(DF)回复于 2005-10-15 12:20:14 得分 0

在你的程序中生成这个类对象,然后调用bool   return_mac(BYTE   *MAC_buffer)即可!Top

相关问题

  • 如何获得mac 地址
  • 如何根据IP地址获得其MAC地址?
  • 使用VB程序获得本机IP地址???如何实现?
  • 获得地址
  • 获得地址
  • 请问在Windows2000下如何获得网卡地址(6字节的MAC地址)
  • 已知IP地址,如何获得主机的MAC地址??(BCB实现)
  • IPv6中根据MAC地址获得IP地址的命令是什么?
  • 如何在程序里获得本机的MAC地址?
  • 在Delphi中如何获得网卡的MAC地址?

关键词

  • mac
  • hr
  • 信息
  • ncb
  • uretcode
  • lana
  • pulmac
  • sendarp
  • 地址
  • 网卡

得分解答快速导航

  • 帖主:mikeyangoo
  • tangrh

相关链接

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

广告也精彩

反馈

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