
在家用路由器上,如果局域网是动态分配的地址,以TPlink为例,在“DHCP客户端”链接里可以找到,如果是静态分配的地址,在“静态地址分配”链接里可以找到。上述关键字在不同设备和版本上不尽相同,也不一定是一模一样的字样,有的在arp列表里。
在支持命令行的专业路由器上,用show arp或display arp可以查询到。
arp是所有路由器支持的协议,通过ip去查询mac地址,将三层报文在数据链路层上传输,路由器通过此协议周期性与局域网所有电脑交互信息,目的是确保路由器与电脑之间是否互通。
正如图中看到的一样,存在着两种WiFi设备,具体是哪一类要看IEEE80211标准的MLME如何实现。
如果直接通过硬件实现,那么设备就是硬MAC(fullMAC)设备;如果通过软件的方式实现,那么设备就是软MAC(softMAC)设备。现阶段大部分无线设备都是软件实现的软MAC设备。
通常我们把Linux内核无线子系统看成两大块:cfg80211和mac80211,它们连通内核其他模块和用户空间的应用程序。
特别指出,cfg80211在内核空间提供配置管理服务,内核与应用层通过nl80211实现配置管理接口。需要记住的是,
硬MAC设备和软MAC设备都需要cfg80211才能工作。而mac80211只是一个驱动API,它只支持软件实现的软MAC设备。
接下来,我们主要关注软MAC设备。
Linux内核无线子系统统一各种WiFi设备,并处理OSI模型中最底层的MAC、PHY两层。
若进一步划分,MAC层可以分为MAC高层和MAC底层。前者负责管理MAC层无线网络的探测发现、身份认证、关联等;
后者实现MAC层如ACK等紧急 *** 作。大部分情况下,硬件(如无线适配器)处理大部分的PHY层以及MAC底层 *** 作。Linux子系统实现大部分的MAC高层回调函数。
2模块间接口
从图一中我们可以看出,各个模块之间分界线很清晰,并且模块间相互透明不可见。模块之间一般不会相互影响。
举个例子,我们在WiFi设备驱动做修改(如,打补丁、添加新的WiFi驱动等),这些变更并不会影响到mac80211模块,
所以我们根本不用改动mac80211的代码。再如,回龙观北大青鸟建议添加一个新的网络协议理论上是不用修改套接字层以及设备无关层代码。一般情况下,内核通过一系列的函数指针实现各层之间相互透明。
1NDIS(DDK)通过驱动程序获取MAC地址
ndis规范中说明,网卡驱动程序支持ioctl_ndis_query_stats接口
参数如下:
OID_802_3_PERMANENT_ADDRESS :物理地址
OID_802_3_CURRENT_ADDRESS :mac地址
于是我们的方法就得到了。
首先,看看注册表,找一找网卡有几块,分别是什么设备名。
具体位置和os有关,2000下在hlm/software/microsoft/windows nt/current version/networkcards。
然后createfile(devicename,)注意,要用linkname,因此
还要加上"//////device//"
接着
deviceiocontrol(hmac,IOCTL_NDIS_QUERY_STATS,
OID_802_3_PERMANENT_ADDRESS/OID_802_3_CURRENT_ADDRESS)
具体的情况可以参看ddk下的
OID_802_3_CURRENT_ADDRESS条目
2NetAPI-2得到MAC (MSDN推荐方法)
#include <windowsh>
//#include <winconh>
#include <stdlibh>
#include <stdioh>
#include <timeh>
typedef struct _ASTAT_
{
ADAPTER_STATUS adapt;
NAME_BUFFER NameBuff [30];
}ASTAT, PASTAT;
ASTAT Adapter;
int main (void)
{
NCB Ncb;
UCHAR uRetCode;
char NetName[50];
LANA_ENUM lenum;
int i;
memset( &Ncb, 0, sizeof(Ncb) );
Ncbncb_command = NCBENUM;
Ncbncb_buffer = (UCHAR )&lenum;
Ncbncb_length = sizeof(lenum);
uRetCode = Netbios( &Ncb );
printf( "The NCBENUM return code is: 0x%x /n", uRetCode );
for(i=0; i < lenumlength ;i++)
{
memset( &Ncb, 0, sizeof(Ncb) );
Ncbncb_command = NCBRESET;
Ncbncb_lana_num = lenumlana;
uRetCode = Netbios( &Ncb );
printf( "The NCBRESET on LANA %d return code is: 0x%x /n",
lenumlana, uRetCode );
memset( &Ncb, 0, sizeof (Ncb) );
Ncbncb_command = NCBASTAT;
Ncbncb_lana_num = lenumlana;
strcpy( Ncbncb_callname, " " );
Ncbncb_buffer = (char ) &Adapter;
Ncbncb_length = sizeof(Adapter);
uRetCode = Netbios( &Ncb );
printf( "The NCBASTAT on LANA %d return code is: 0x%x /n",
lenumlana, uRetCode );
if ( uRetCode == 0 )
{
printf( "The Ethernet Number on LANA %d is:%02x%02x%02x%02x%02x%02x/n",
lenumlana,
Adapteradaptadapter_address[0],
Adapteradaptadapter_address[1],
Adapteradaptadapter_address[2],
Adapteradaptadapter_address[3],
Adapteradaptadapter_address[4],
Adapteradaptadapter_address[5] );
}
}
}
3用COM API获取网卡MAC地址
这种方法使用COM API创建一个GUID(全局唯一标识符)并从那里继承MAC地址。
GUID通常用来标识COM组件以及系统中的其他对象。它们是由MAC地址(结合其他东西)计算得来的,表面上MAC地址就包含在其中。
我说表面上是因为事实上并没有包含。我提供这种方法更多的是为了作为反面教材。您也许用这种方法能够得到MAC地址,但
有时候您只会得到随机的十六进制数值。下面的例子十分简单,无需多讲。我们使用CoCreateGuid创建GUID,并将最后六个字节
放入字符串中。它们可能是MAC地址,但并不是必然的。
uuidcpp
#include <windowsh>
#include <iostream>
#include <conioh>
using namespace std;
int main()
{
cout << "MAC address is: ";
// 向COM要求一个UUID。如果机器中有以太网卡,
// UUID最后的六个字节(Data4的2-7字节)应该是本地以太网卡的MAC地址。
GUID uuid;
CoCreateGuid(&uuid);
// Spit the address out
char mac_addr[18];
sprintf(mac_addr,"%02X:%02X:%02X:%02X:%02X:%02X",
uuidData4[2],uuidData4[3],uuidData4[4],
uuidData4[5],uuidData4[6],uuidData4[7]);
cout << mac_addr << endl;
getch();
return 0;
}
4用NetAPI来获取网卡MAC地址
首先在头文件定义中加入#include "nb30h"
#pragma comment(lib,"netapi32lib")
typedef struct _ASTAT_
{
ADAPTER_STATUS adapt;
NAME_BUFFER NameBuff[30];
} ASTAT, PASTAT;
就可以这样调用来获取远程网卡MAC地址了:
CString GetMacAddress(CString sNetBiosName)
{
ASTAT Adapter;
NCB ncb;
UCHAR uRetCode;
memset(&ncb, 0, sizeof(ncb));
ncbncb_command = NCBRESET;
ncbncb_lana_num = 0;
uRetCode = Netbios(&ncb);
memset(&ncb, 0, sizeof(ncb));
ncbncb_command = NCBASTAT;
ncbncb_lana_num = 0;
sNetBiosNameMakeUpper();
FillMemory(ncbncb_callname, NCBNAMSZ - 1, 0x20);
strcpy((char )ncbncb_callname, (LPCTSTR) sNetBiosName);
ncbncb_callname[sNetBiosNameGetLength()] = 0x20;
ncbncb_callname[NCBNAMSZ] = 0x0;
ncbncb_buffer = (unsigned char ) &Adapter;
ncbncb_length = sizeof(Adapter);
uRetCode = Netbios(&ncb);
CString sMacAddress;
if (uRetCode == 0)
{
sMacAddressFormat(_T("%02x%02x%02x%02x%02x%02x"),
Adapteradaptadapter_address[0],
Adapteradaptadapter_address[1],
Adapteradaptadapter_address[2],
Adapteradaptadapter_address[3],
Adapteradaptadapter_address[4],
Adapteradaptadapter_address[5]);
}
return sMacAddress;
}
arp协议是“address
resolution
protocol”(地址解析协议)的缩写。在局域网中,网络中实际传输的是“帧”,帧里面是有目标主机的mac地址的。在以太网中,一个主机要和另一个主机进行直接通信,必须要知道目标主机的mac地址。但这个目标mac地址是如何获得的呢?它就是通过地址解析协议获得的。所谓“地址解析”就是主机在发送帧前将目标ip地址转换成目标mac地址的过程。arp协议的基本功能就是通过目标设备的ip地址,查询目标设备的mac地址,以保证通信的顺利进行。
网络定义分为7层,MAC地址属于第二层的,它不是固定的,可以更改的!在开始--运行--里边输入CMD--回车--然后输入ipconfig
/all就可以查看了,里边有个Physical
Address,后边的就是MAC地址!你要限制他们的网速的话,可以在路由器里边将他们的MAC地址与IP地址绑定,这样他们每次获取IP的话,都是同一个IP,然后你将他们的IP地址添加到限制网速的列表里边就可以了!
有很多使用苹果电脑的朋友需要修改网卡MAC地址,但网上大部分教程都是修改windows的MAC地址,而Mac却比较少。因此PC6小编整理了Mac电脑如何修改MAC地址的方法。
1、首先,打开“终端“,运行这个命令生成一个新的MAC网卡地址:
openssl rand -hex 6 | sed 's/\(\)/\1:/g; s/$//'
2、然后执行命令,断开Airport 无线网卡连接:
sudo /System/Library/PrivateFrameworks/Apple80211framework/Resources/airport -z
3、输入修改mac地址的命令:
sudo ifconfig en0 ether xx:xx:xx:xx:xx:xx
将你要修改的MAC地址代替xx:xx:xx:xx:xx:xx
将你要修改的网卡代替en0
4、然后输入命令重连网卡即可:
networksetup -detectnewhardware
以上就是关于如何获取局域网内设备IP地址和MAC地址全部的内容,包括:如何获取局域网内设备IP地址和MAC地址、linux系统内核数据、哪种方法获取Mac 地址等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)