===如何获得当前"使用的"MAC地址===
如何获得当前"使用的"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




