怎样获得当前联网的物理网卡(虚拟机网卡忽略)的MAC地址?也就是只获得一个MAC地址

willa_scut 2011-07-21 11:04:29
1.已经使用NCB、netbios方法实现,但是不能区分物理网卡和虚拟机的网卡。
2.区分物理网卡和虚拟网卡的一个方法是通过网卡名称获得它的注册表信息,二者的PnpInstanceID字段不一样,物理网卡的PnpInstanceID字段都以PCI开头。使用IP_ADAPTER_INFO *IpAdaptersInfo的GetAdaptersInfo()方法将获得主机上所有的网卡.这个方法已经实现,它能区别物理网卡和虚拟网卡,但是不能区别该网卡是否正在使用。
3.我的一个想法是结合NCB和注册表信息,使用NCB服务获得网络中得所有网卡,再通过网卡名称(Adaptername如7B0968E1-848C-43AF-942C-59F4187472D4)查看特定网卡的注册表信息,判断它是不是物理网卡。现在的问题是NCB服务中没有网卡名称(Adaptername)这个信息,只有网卡的内部编号lana_num如0,ADAPTER_STATUS结构中也只有adapter_type,不符合要求
4.使用C#.NET实现的方法我已经知道了,但是我不能使用.NET框架,要使用C++与MFC编程。所以NetworkInterface实现的方法不能用。
...全文
950 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
nightkids_008 2011-07-21
  • 打赏
  • 举报
回复
友情支持。。。等big cow
willa_scut 2011-07-21
  • 打赏
  • 举报
回复
补充:当前正在联网的意思。如笔记本有两个网卡,如果只使用无线上网(有线网线拔出),那就是返回无线的MAC地址。如果使用两个网卡同时上网,则要获取两个的MAC地址。
至善者善之敌 2011-07-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 willa_scut 的回复:]
恩,这个问题已经解决了。用了个很迂回的方法。
netbios可以获取当前网络中的所有网卡的MAC地址。它使用ncb结构和ADAPTER_STATUS实现。它能够获得网卡的数量,并进行内部编号。在利用内部编号循环,获取MAC地址
GetAdaptersInfo()能获得本机的所有网卡的MAC地址,并使用adaptername变量打开该网卡的注册信息表,判定该网卡是不是物理网卡。
我之前一直希望……
[/Quote]


++++1
willa_scut 2011-07-21
  • 打赏
  • 举报
回复
恩,这个问题已经解决了。用了个很迂回的方法。
netbios可以获取当前网络中的所有网卡的MAC地址。它使用ncb结构和ADAPTER_STATUS实现。它能够获得网卡的数量,并进行内部编号。在利用内部编号循环,获取MAC地址
GetAdaptersInfo()能获得本机的所有网卡的MAC地址,并使用adaptername变量打开该网卡的注册信息表,判定该网卡是不是物理网卡。
我之前一直希望从netbios获取网卡名称,来打开注册信息表,判定是不是物理网卡。但是,可惜,netbios并没有提供这个字段。
无奈又不想全部重写,左思右想,想了一个很麻烦低效率的解决方案。
使用MAC地址来统一两个方法。主要流程如下:
1.使用netbios,getNetMAC()
2.在getOneMAC()函数中利用MAC地址mac_adr变量调用getLocalMAC(string)函数
getLocalMAC()函数会遍历本地的所有网卡。
并判断是不是物理网卡(ifIsLocalAdapter(adaptername)),如果是物理网卡,则获取它的MAC地址local_MAC。
3.比较mac_adr与local_MAC二者的值,如果相等,表示通过了两轮的筛选,输出。否则继续循环
这样嵌套了两层循环,属于低效率,但是好歹把问题解决了,还是很开心。
如果大牛们有更好地方法(一定有),希望不吝赐教啊

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧