我不知道微软对网卡类型是否有统一标准。目前对ipconfig列出的信息
我们一般有两个步骤可以获取到:
1)大部分信息(包括MAC)通过GetAdaptersInfo可以获取到,但IP_ADAPTER_INFO结构里的“type域”对无线网卡无能为力,始终都是6(MIB_IF_TYPE_ETHERNET)
2)IP_ADAPTER_INFO中“AdapterName”存储的是设备的UUID,该值在注册表中有记载:
“HKEY_LOCAL_MACHINE\\System\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}”
始终在“{4D36E972-E325-11CE-BFC1-08002BE10318}”下会有子键对应IP_ADAPTER_INFO的“AdapterName”域的UUID。并且在该子键中有一个项目“Name”,“Name”对应的是连接类型字符串,如“本地连接”、“无线网络连接”。该项对应的字符串值和ipconfig获取的信息是一致的。
唯一可惜的是它是个字符串值,而不是个数值。是否所有的无线网卡都能匹配该字符串值,我不知道。
一、Linux网络属性配置
1Linux主机接入到网络方式
IP/NETMASK:实现本地网络通信
路由(网关):可以进行跨网络通信
DNS服务器地址:基于主机名的通信,Linux可以有三个DNS地址
当第一个地址本身挂了,才会查找其备用地址;若第一个地址无法解析则停止
2网络属性配置方式
(1)静态指定
1)命令方式
ifcfg系列命令:
ifconfig:配置IP,NETMASK
route:配置路由相关信息
netstat:状态及统计数据查看
iiproute2系列命令:
ip OBJECT:
addr:地址和掩码;
link:接口
route:路由
ss:状态及统计数据查看
CentOS 7:nm(Network Manager)家族
nmcli:命令行工具
nmtui:text window 工具
hostname/hostnamectl:主机名配置
2) 配置文件:
RedHat及相关发行版:/etc/sysconfig/network-scripts/ifcfg-NETCARD_NAME
DNS服务器指定配置文件:/etc/resolvconf
本地主机名配置文件:/etc/sysconfig/network
注:命令配置能及时生效,但时关闭当前进程之后配置失效,为一次性配置方式
通过配置文件配置网络属性,无法立即生效,需要重启服务、重新加载配置文件或者重启进程
(2)动态分配:依赖于本地网络中有DHCP服务
DHCP:Dynamic Host Configure Procotol, 动态主机配置协议,此时不能固定IP地址
3网络接口命名
(1)传统命名
以太网:eth#,例如eth0, eth1, …
PPP网络:ppp#, 例如,ppp0, ppp1, …
(2)可预测命名方案(CentOS 7)
支持多种不同的命名机制,根据Fireware, 拓扑结构等信息自动配置
1) Firmware或BIOS为主板上集成的设备提供的索引信息可用,则根据此索引进行命名,如eno1,eno2, …
2) Firmware或BIOS为PCI-E扩展槽所提供的索引信息可用,且可预测,则根据此索引进行命名,如ens1, ens2, …
3) 如果硬件接口的物理位置信息可用,则根据此信息命名,如enp2s0, …
4) 如果用户显式定义,也可根据MAC地址命名,例如eno16777736(十六进制MAC), …
5)上述均不可用,则仍使用传统方式命名;
(3)命名格式的组成
en:ethernet,表示因特网网卡接口
wl:wlan,表示无线网网卡接口
ww:wwan,Wireless Wide Area Network,表示无线广域网网卡
(4)名称类型:
o<index>:集成设备的设备索引号;
s<slot>:扩展槽的索引号;
x<MAC>:基于MAC地址的命名;
p<bus>s<slot>:基于总线及槽的拓扑结构进行命名;
在#include <pcap/pcaph>的下面,加3行:
#pragma comment(lib, "Libnetlib")
#pragma comment(lib, "Packetlib")
#pragma comment(lib, "wpcaplib")
如果提示找不到这三个LIB的话,就把VS的LIB路径设置到有这三个文件的目录上
Linux *** 作系统的网卡设备的传统命名方式是 eth0、eth1、eth2等,而 CentOS7 提供了不同的命名规则,默认是基于固件、拓扑、位置信息来分配。这样做的优点是命名全自动的、可预知的,缺点是比 eth0、wlan0 更难读,比如 ens33 。
规则1:
对于板载设备命名合并固件或 BIOS 提供的索引号,如果来自固件或 BIOS 的信息可读就命名,比如eno1,这种命名是比较常见的,否则使用规则2。
规则2:
命名合并固件或 BIOS 提供的 PCI-E 热插拔口索引号,比如 ens1,如果信息可读就使用,否则使用规则3。
规则3:
命名合并硬件接口的物理位置,比如 enp2s0,可用就命名,失败直接到方案5。
规则4:
命名合并接口的 MAC 地址,比如 enx78e7d1ea46da,默认不使用,除非用户选择使用此方案。
规则5:
使用传统的方案,如果所有的方案都失败,使用类似 eth0 这样的样式。
1、前2个字符的含义
2、第3个字符根据设备类型选择
如果不习惯使用新的命名规则,可以恢复使用传统的方式命名,编辑 grub 文件,增加两个变量,再使用 grub2-mkconfig 重新生成 grub 配置文件即可。
1、编辑 grub 配置文件
2、重新生成 grub 配置文件
然后重新启动 Linux *** 作系统,通过 ip addr 可以看到网卡名称已经变为 eth0 。
3、修改网卡配置文件
原来网卡配置文件名称为 ifcfg-ens33,这里需要修改为 ethx 的格式,并适当调整网卡配置文件。
注意:ifcfg-ens33 文件最好删除掉,否则重启 network 服务时候会报错。
PHP获取网卡MAC地址的方法- -
做一个限定用户登录的东西时用到这段代码,可能还有人会用到,拿出来分享
<php
@exec("ipconfig /all",$array);
for($Tmpa;$Tmpa<count($array);$Tmpa++){
if(eregi("Physical",$array[$Tmpa])){
$mac=explode(":",$array[$Tmpa]);
echo $mac[1];
}
}
>
CString GetMacAddress()
/
通过WMI取第一块活动网卡地址,事先需要调用过CoInitialize()初始化COM
/
{
HRESULT hRes;
hRes = CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_DEFAULT,
RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL);
if (FAILED(hRes))
return _T("");
IWbemLocator pLoc = NULL;
hRes = CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID)&pLoc);
if (FAILED(hRes))
return _T("");
IWbemServices pSvc = NULL;
hRes = pLoc->ConnectServer(_bstr_t(L"ROOT\\CIMV2"), NULL, NULL, 0,
NULL, 0, 0, &pSvc);
if (FAILED(hRes))
{
pLoc->Release();
return _T("");
}
hRes = CoSetProxyBlanket(pSvc, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE,
NULL, RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_DEFAULT);
if (FAILED(hRes))
{
pSvc->Release();
pLoc->Release();
return _T("");
}
IEnumWbemClassObject pEnumerator = NULL;
hRes = pSvc->ExecQuery(_bstr_t(L"WQL"),
_bstr_t(L"SELECT FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = TRUE"),
WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
NULL, &pEnumerator);
if (FAILED(hRes))
{
pSvc->Release();
pLoc->Release();
return _T("");
}
CString szMacAddress = _T("");
while (true)
{
IWbemClassObject pclsObj = NULL;
ULONG uReturn = 0;
hRes = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn);
if (FAILED(hRes) || !uReturn)
break;
VARIANT vtProp;
VariantInit(&vtProp);
if (SUCCEEDED(pclsObj->Get(L"MACAddress", 0, &vtProp, 0, 0)))
{
if (V_VT(&vtProp) == VT_BSTR)
{
szMacAddress = vtPropbstrVal;
VariantClear(&vtProp);
pclsObj->Release();
break;
}
VariantClear(&vtProp);
}
pclsObj->Release();
}
pEnumerator->Release();
pSvc->Release();
pLoc->Release();
return szMacAddress;
}
------解决方案--------------------奥,那个DLL大概在02年左右整理的好像,时间太久了,应该是不支持vsita的,楼主看看这段代码是否有用?我是拷贝来的:/ //函数名称:GetDriverInfomation //函数功能:得到驱动器的信息 //参数1:bAlpha - BYTE型,驱动器的代号A-Z(a-z) //参数2:iGTI_TYPE - int,将要获取的驱动器信息类型 // GDI_VOLUMENAME 得到驱动器名字 // GDI_VOLUMESERIALNUMBER 得到驱动器序列号 // GDI_VOLUMEFILESYSTEM 得到驱动器文件系统 // GDI_VOLUMETYPE 得到驱动器类型 // GDI_VOLUMESIZE 得到驱动器总大小 // GDI_VOLUMEFREESIZE 得到驱动器剩余大小 //返回值:CString型,所要得到的驱动器信息的字符串表达 //例子:得到C盘的名字GetDriverInfomation('C',GDI_VOLUMENAME) / #define GDI_VOLUMENAME 0 #define GDI_VOLUMESERIALNUMBER 1 #define GDI_VOLUMEFILESYSTEM 2 #define GDI_VOLUMETYPE 3 #define GDI_VOLUMESIZE 4 #define GDI_VOLUMEFREESIZE 5 CString GetDriverInfomation(BYTE bAlpha,int iGTI_TYPE) { CString strResult = _T("");
代码如下:
using System;using SystemDrawing;
using SystemWindowsForms;
using SystemManagement; //必须在项目中添加SystemManagement引用!
using SystemCollectionsGeneric;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
comboBox1DropDownStyle = ComboBoxStyleDropDownList;
comboBox1ItemsAddRange(GetNetcardName()ToArray());
}
// 获取计算机上安装的网卡名称
private List<string> GetNetcardName()
{
List<string> cardNames = new List<string>();
ManagementClass mc =
new ManagementClass("Win32_NetworkAdapter");
ManagementObjectCollection moc = mcGetInstances();
foreach (ManagementObject mo in moc)
{
cardNamesAdd(mo["Description"]ToString());
}
return cardNames;
}
}
}
以上就是关于VC实现查看无线网卡的MAC地址全部的内容,包括:VC实现查看无线网卡的MAC地址、Linux关于网卡的几个命令、刚刚开始学winpcap编程,第一个是获取网卡详细信息的程序,编译时出现这个错误。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)