区分本地网卡是物理网卡还是虚拟网卡

本地物理网卡的MAC地址。

GetAdaptersInfo 可以获得本机所有网卡的信息,然而这些网卡中可能包括虚拟网卡。例如,若安装了 VMWare 或者某些 VPN 客户端软件,则会出现若干虚拟网卡。它们在形式上与物理网卡几乎没有区别。 ipconfig 将它们与本地物理网卡等同对待。

有些人建议使用 MAC 地址中的 "locally administread bit" 来区分。而事实证明这是靠不住的。http://hi.baidu.com/xzq2000/blog/item/43b686d672cd762f07088b95.html
是目前我找到的比较实用的办法。

其原理是先由 GetAdaptersInfo 获取所有网卡的基本信息。然后利用网卡名去注册表中查找对应的硬件信息。若是物理网卡,其硬件信息中通常会包含 PCI 。

例如,某个网卡的名为 {ACA306D0-1D69-4116-BC2B-919B428AD084}。
他在注册表中的信息所在位置为:
HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Network/{4D36E972-E325-11CE-BFC1-08002BE10318}/{ACA306D0-1D69-4116-BC2B-919B428AD084}/Connection

若PnpInstanceID的值以PCI开头,说明是物理网卡,MediaSubType为01则是常见网卡,02为无线网卡。

以下代码是从上述网页中转贴。该例中仅当网卡为有线物理网卡时才返回true.

bool IsLocalAdapter (  const   char   * pAdapterName )  const
{
    BOOL ret_value 
= FALSE;

#define NET_CARD_KEY "System/CurrentControlSet/Control/Network/{4D36E972-E325-11CE-BFC1-08002BE10318}"
    
char szDataBuf[MAX_PATH+1];
    DWORD dwDataLen 
= MAX_PATH;
    DWORD dwType 
= REG_SZ;
    HKEY hNetKey 
= NULL;
    HKEY hLocalNet 
= NULL;

    
if(ERROR_SUCCESS != RegOpenKeyEx(HKEY_LOCAL_MACHINE, NET_CARD_KEY, 0, KEY_READ, &hNetKey))
        
return FALSE;
    sprintf(szDataBuf, 
"%s/Connection", pAdapterName);
    
if(ERROR_SUCCESS != RegOpenKeyEx(hNetKey ,szDataBuf ,0 ,KEY_READ, &hLocalNet))
    
{
        RegCloseKey(hNetKey);
        
return FALSE;
    }

    
if (ERROR_SUCCESS != RegQueryValueEx(hLocalNet, "MediaSubType"0&dwType, (BYTE *)szDataBuf, &dwDataLen))
    
{
        
goto ret;
    }

    
if (*((DWORD *)szDataBuf)!=0x01)
        
goto ret;
    dwDataLen 
= MAX_PATH;
    
if (ERROR_SUCCESS != RegQueryValueEx(hLocalNet, "PnpInstanceID"0&dwType, (BYTE *)szDataBuf, &dwDataLen))
    
{
        
goto ret;
    }

    
if (strncmp(szDataBuf, "PCI", strlen("PCI")))
        
goto ret;

    ret_value 
= TRUE;

ret:
    RegCloseKey(hLocalNet);
    RegCloseKey(hNetKey);

    
return ret_value!=0;

}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
Linux操作系统中的网络接口可以分为三种类型:本机网卡、回环网卡虚拟网卡。 1. 本机网卡: 本机网卡是指物理连接到计算机的网卡设备,它通过电缆连接到网络中的其他设备,并负责接收和发送网络数据包。在Linux中,本机网卡通常被称为实体网卡,每个实体网卡都有唯一的MAC地址,有可能是有线网卡、无线网卡或者其他类型的物理接口。Linux操作系统使用驱动程序与本机网卡进行通信,使其能够进行网络通信。 2. 回环网卡: 回环网卡是Linux系统内置的虚拟网卡,它模拟了一个虚拟的网络接口。回环网卡不需要物理设备支持,数据包在发送和接收时都会在回环网卡上进行转发处理。回环网卡的IP地址通常设置为"127.0.0.1",也被称为"本地回环地址"。通过回环网卡,我们可以在本机上进行网络连接测试、网络服务测试等,而无需与其他设备进行实际的网络通信。 3. 虚拟网卡虚拟网卡是一种软件实现的网络接口,它并不对应物理设备。在Linux系统中,虚拟网卡可以通过网络命令进行创建和配置。虚拟网卡可以用于各种不同的场景,比如网络隔离、虚拟化环境中的网络互联等。虚拟网卡在操作系统中以网络设备驱动程序的形式存在,通过驱动程序与操作系统进行通信,实现网络数据的发送和接收。 总结来说,Linux操作系统中的网络接口分为本机网卡、回环网卡虚拟网卡。本机网卡物理连接计算机的网卡设备,回环网卡是模拟的虚拟网卡用于本机测试,而虚拟网卡是一种软件实现的网络接口,用于虚拟化环境中的网络互联等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值