如何得到主机的MAC地址 我知道如何用NetBEUI得到局域网地址,但我没有这个协议,在这种情况下,我如何能得到本机MAC地址 谢谢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 可以参考下面这篇文章http://hi.baidu.com/baibaiwei/blog/item/2712a8012e1348021d9583cf.html 这里给你一个例子http://download.csdn.net/source/2681512 本帖最后由 VisualEleven 于 2010-11-16 11:46:33 编辑 通过GetAdaptersInfo获取网卡MAC #include <winsock2.h>#include <iphlpapi.h>#include <stdlib.h>#define MALLOC(x) HeapAlloc(GetProcessHeap(), 0, (x))#define FREE(x) HeapFree(GetProcessHeap(), 0, (x))/* Note: could also use malloc() and free() */int __cdecl main(int argc, char **argv){ /* Declare and initialize variables */ DWORD dwSize = 0; DWORD dwRetVal = 0; int i = 0; // Set the flags to pass to GetAdaptersAddresses ULONG flags = GAA_FLAG_INCLUDE_PREFIX; // default to unspecified address family (both) ULONG family = AF_UNSPEC; LPVOID lpMsgBuf = NULL; PIP_ADAPTER_ADDRESSES pAddresses = NULL; ULONG outBufLen = 0; PIP_ADAPTER_ADDRESSES pCurrAddresses = NULL; PIP_ADAPTER_UNICAST_ADDRESS pUnicast = NULL; PIP_ADAPTER_ANYCAST_ADDRESS pAnycast = NULL; PIP_ADAPTER_MULTICAST_ADDRESS pMulticast = NULL; IP_ADAPTER_DNS_SERVER_ADDRESS *pDnServer = NULL; IP_ADAPTER_PREFIX *pPrefix = NULL; if (argc != 2) { printf(" Usage: getadapteraddresses family\n"); printf(" getadapteraddresses 4 (for IPv4)\n"); printf(" getadapteraddresses 6 (for IPv6)\n"); printf(" getadapteraddresses A (for both IPv4 and IPv6)\n"); exit(1); } if (atoi(argv[1]) == 4) family = AF_INET; else if (atoi(argv[1]) == 6) family = AF_INET6; outBufLen = sizeof (IP_ADAPTER_ADDRESSES); pAddresses = (IP_ADAPTER_ADDRESSES *) MALLOC(outBufLen); // Make an initial call to GetAdaptersAddresses to get the // size needed into the outBufLen variable if (GetAdaptersAddresses(family, flags, NULL, pAddresses, &outBufLen) == ERROR_BUFFER_OVERFLOW) { FREE(pAddresses); pAddresses = (IP_ADAPTER_ADDRESSES *) MALLOC(outBufLen); } if (pAddresses == NULL) { printf("Memory allocation failed for IP_ADAPTER_ADDRESSES struct\n"); exit(1); } // Make a second call to GetAdapters Addresses to get the // actual data we want printf("Memory allocated for GetAdapterAddresses = %d bytes\n", outBufLen); printf("Calling GetAdaptersAddresses function with family = "); if (family == AF_INET) printf("AF_INET\n"); if (family == AF_INET6) printf("AF_INET6\n"); if (family == AF_UNSPEC) printf("AF_UNSPEC\n\n"); dwRetVal = GetAdaptersAddresses(family, flags, NULL, pAddresses, &outBufLen); if (dwRetVal == NO_ERROR) { // If successful, output some information from the data we received pCurrAddresses = pAddresses; while (pCurrAddresses) { printf("\tLength of the IP_ADAPTER_ADDRESS struct: %ld\n", pCurrAddresses->Length); printf("\tIfIndex (IPv4 interface): %u\n", pCurrAddresses->IfIndex); printf("\tAdapter name: %s\n", pCurrAddresses->AdapterName); pUnicast = pCurrAddresses->FirstUnicastAddress; if (pUnicast != NULL) { for (i = 0; pUnicast != NULL; i++) pUnicast = pUnicast->Next; printf("\tNumber of Unicast Addresses: %d\n", i); } else printf("\tNo Unicast Addresses\n"); pAnycast = pCurrAddresses->FirstAnycastAddress; if (pAnycast) { for (i = 0; pUnicast != NULL; i++) pAnycast = pAnycast->Next; printf("\tNumber of Anycast Addresses: %d\n", i); } else printf("\tNo Anycast Addresses\n"); pMulticast = pCurrAddresses->FirstMulticastAddress; if (pMulticast) { for (i = 0; pMulticast != NULL; i++) pMulticast = pMulticast->Next; printf("\tNumber of Multicast Addresses: %d\n", i); } else printf("\tNo Multicast Addresses\n"); pDnServer = pCurrAddresses->FirstDnsServerAddress; if (pDnServer) { for (i = 0; pDnServer != NULL; i++) pDnServer = pDnServer->Next; printf("\tNumber of DNS Server Addresses: %d\n", i); } else printf("\tNo DNS Server Addresses\n"); printf("\tDNS Suffix: %wS\n", pCurrAddresses->DnsSuffix); printf("\tDescription: %wS\n", pCurrAddresses->Description); printf("\tFriendly name: %wS\n", pCurrAddresses->FriendlyName); if (pCurrAddresses->PhysicalAddressLength != 0) { printf("\tPhysical address: "); for (i = 0; i < (int) pCurrAddresses->PhysicalAddressLength; i++) { if (i == (pCurrAddresses->PhysicalAddressLength - 1)) printf("%.2X\n", (int) pCurrAddresses->PhysicalAddress[i]); else printf("%.2X-", (int) pCurrAddresses->PhysicalAddress[i]); } } printf("\tFlags: %ld\n", pCurrAddresses->Flags); printf("\tMtu: %lu\n", pCurrAddresses->Mtu); printf("\tIfType: %ld\n", pCurrAddresses->IfType); printf("\tOperStatus: %ld\n", pCurrAddresses->OperStatus); printf("\tIpv6IfIndex (IPv6 interface): %u\n", pCurrAddresses->Ipv6IfIndex); printf("\tZoneIndices (hex): "); for (i = 0; i < 16; i++) printf("%lx ", pCurrAddresses->ZoneIndices[i]); printf("\n"); pPrefix = pCurrAddresses->FirstPrefix; if (pPrefix) { for (i = 0; pPrefix != NULL; i++) pPrefix = pPrefix->Next; printf("\tNumber of IP Adapter Prefix entries: %d\n", i); } else printf("\tNo IP Adapter Prefix entries\n"); printf("\n"); pCurrAddresses = pCurrAddresses->Next; } } else { printf("Call to GetAdaptersAddresses failed with error: %d\n", dwRetVal); if (dwRetVal == ERROR_NO_DATA) printf("\tNo addresses were found for the requested parameters\n"); else { if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dwRetVal, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language (LPTSTR) & lpMsgBuf, 0, NULL)) { printf("\tError: %s", lpMsgBuf); LocalFree(lpMsgBuf); FREE(pAddresses); exit(1); } } } FREE(pAddresses); return 0;} NCB Ncb ,ncb1; UCHAR uRetCode ,retCode; LANA_ENUM lenum; int i = 0; typedef struct _ASTAT_ { ADAPTER_STATUS adapt; NAME_BUFFER NameBuff [30]; }ASTAT, * PASTAT; ASTAT Adapter; memset(&Ncb, 0, sizeof(Ncb)); Ncb.ncb_command = NCBENUM; Ncb.ncb_buffer = (UCHAR *)&lenum; Ncb.ncb_length = sizeof(lenum); Netbios(&Ncb); for(i=0; i < lenum.length ;i++) { memset( &ncb1, 0, sizeof(ncb1) ); ncb1.ncb_command = NCBRESET; ncb1.ncb_lana_num = lenum.lana[i]; // 指定网卡号 retCode = Netbios( &ncb1 ); memset( &ncb1, 0, sizeof(ncb1) ); ncb1.ncb_command = NCBASTAT; ncb1.ncb_lana_num = lenum.lana[i]; // 指定网卡号 strcpy( (char *)ncb1.ncb_callname,"*" ); // 指定返回的信息存放的变量 ncb1.ncb_buffer = (unsigned char *) &Adapter; ncb1.ncb_length = sizeof(Adapter); // 发送NCBASTAT命令以获取网卡的信息 retCode = Netbios( &ncb1 ); if ( retCode == 0 ) { CString strMacAddr; strMacAddr.Format( "%02X%02X%02X%02X%02X%02X", Adapter.adapt.adapter_address[0], Adapter.adapt.adapter_address[1], Adapter.adapt.adapter_address[2], Adapter.adapt.adapter_address[3], Adapter.adapt.adapter_address[4], Adapter.adapt.adapter_address[5] ); return strMacAddr; } } return ""; 你的机器中可能不止一个网卡信息BYTE AdapterMAC[8]; //保存网卡mac地址IP_ADAPTER_INFO pAdapterInfo[10]; //IP_ADAPTER_INFO为网卡信息结构体,其中AdapterName表示网卡名,Address(BYTE[8])表示MAC地址,IpAddressList.IpAddress表示ip地址 DWORD dwBufLen = sizeof(IP_ADAPTER_INFO)*10; DWORD dwStatus = GetAdaptersInfo( pAdapterInfo, // [output] 指向接收数据缓冲指针 &dwBufLen);// [input] 缓冲区大小 assert(dwStatus== ERROR_SUCCESS); PIP_ADAPTER_INFO pAdapter = NULL; DWORD dwRetVal = 0; pAdapter = pAdapterInfo; while (pAdapter) { memcpy(AdapterMAC,pAdapter->Address,sizeof(pAdapter->Address)); return ; } pAdapter = pAdapter->Next; } return ; //获得指定网卡序号的Mac地址void CGetMacAddrDlg::GetOneMac(int AdapterIndex){ NCB ncb; UCHAR uRetCode; ASTAT Adapter; memset( &ncb, 0, sizeof(ncb) ); ncb.ncb_command = NCBRESET; ncb.ncb_lana_num = AdapterIndex; // 指定网卡号 //首先对选定的网卡发送一个NCBRESET命令,以便进行初始化 uRetCode = Netbios( &ncb ); memset( &ncb, 0, sizeof(ncb) ); ncb.ncb_command = NCBASTAT; ncb.ncb_lana_num = AdapterIndex; // 指定网卡号 strcpy( (char *)ncb.ncb_callname,"*" ); // 指定返回的信息存放的变量 ncb.ncb_buffer = (unsigned char *) &Adapter; ncb.ncb_length = sizeof(Adapter); // 发送NCBASTAT命令以获取网卡的信息 uRetCode = Netbios( &ncb ); if ( uRetCode == 0 ) { // 把网卡MAC地址格式化成常用的16进制形式,如0010-A4E4-5802 CString strMacAddr; strMacAddr.Format( "%02X%02X-%02X%02X-%02X%02X\n", Adapter.adapt.adapter_address[0], Adapter.adapt.adapter_address[1], Adapter.adapt.adapter_address[2], Adapter.adapt.adapter_address[3], Adapter.adapt.adapter_address[4], Adapter.adapt.adapter_address[5] ); //将网卡地址和序号存入数组中 ADPTSTRCT AdptSt; AdptSt.nIndex = AdapterIndex; AdptSt.strMac = strMacAddr; m_arrAdapters.Add(AdptSt); }} vc关闭对话框后重新打开,对话框中的clistctrl控件中新插入的数据依然可以显示 请教个概念问题 为什么我的 CryptEncrypt 不能对字符串加密? 如何更改本机ip地址?请多指教 关于ocx组件问题? 为什么我的全局调用函数只能在我的机子上用?在别人的机子上就死机?? 缺msvcp60d.dll msvcrtd.dll文件,他们是什么 在CtreeCtrl中,如何暂存一个HTREEITEM树叉,但是又不可见! 求教有没有用来学习VS2013的MFC的资料? 怎么从标准输入中输入一个字符串 VC6如何将unicode编码的文本文件自动装入access数据库 这几天刚开始学OGRE,我发现自己一个人太难了……
http://hi.baidu.com/baibaiwei/blog/item/2712a8012e1348021d9583cf.html
http://download.csdn.net/source/2681512
#include <iphlpapi.h>
#include <stdlib.h>#define MALLOC(x) HeapAlloc(GetProcessHeap(), 0, (x))
#define FREE(x) HeapFree(GetProcessHeap(), 0, (x))
/* Note: could also use malloc() and free() */int __cdecl main(int argc, char **argv)
{ /* Declare and initialize variables */ DWORD dwSize = 0;
DWORD dwRetVal = 0; int i = 0; // Set the flags to pass to GetAdaptersAddresses
ULONG flags = GAA_FLAG_INCLUDE_PREFIX; // default to unspecified address family (both)
ULONG family = AF_UNSPEC; LPVOID lpMsgBuf = NULL; PIP_ADAPTER_ADDRESSES pAddresses = NULL;
ULONG outBufLen = 0; PIP_ADAPTER_ADDRESSES pCurrAddresses = NULL;
PIP_ADAPTER_UNICAST_ADDRESS pUnicast = NULL;
PIP_ADAPTER_ANYCAST_ADDRESS pAnycast = NULL;
PIP_ADAPTER_MULTICAST_ADDRESS pMulticast = NULL;
IP_ADAPTER_DNS_SERVER_ADDRESS *pDnServer = NULL;
IP_ADAPTER_PREFIX *pPrefix = NULL; if (argc != 2) {
printf(" Usage: getadapteraddresses family\n");
printf(" getadapteraddresses 4 (for IPv4)\n");
printf(" getadapteraddresses 6 (for IPv6)\n");
printf(" getadapteraddresses A (for both IPv4 and IPv6)\n");
exit(1);
} if (atoi(argv[1]) == 4)
family = AF_INET;
else if (atoi(argv[1]) == 6)
family = AF_INET6; outBufLen = sizeof (IP_ADAPTER_ADDRESSES);
pAddresses = (IP_ADAPTER_ADDRESSES *) MALLOC(outBufLen); // Make an initial call to GetAdaptersAddresses to get the
// size needed into the outBufLen variable
if (GetAdaptersAddresses(family, flags, NULL, pAddresses, &outBufLen)
== ERROR_BUFFER_OVERFLOW) {
FREE(pAddresses);
pAddresses = (IP_ADAPTER_ADDRESSES *) MALLOC(outBufLen);
} if (pAddresses == NULL) {
printf("Memory allocation failed for IP_ADAPTER_ADDRESSES struct\n");
exit(1);
}
// Make a second call to GetAdapters Addresses to get the
// actual data we want
printf("Memory allocated for GetAdapterAddresses = %d bytes\n", outBufLen);
printf("Calling GetAdaptersAddresses function with family = ");
if (family == AF_INET)
printf("AF_INET\n");
if (family == AF_INET6)
printf("AF_INET6\n");
if (family == AF_UNSPEC)
printf("AF_UNSPEC\n\n"); dwRetVal =
GetAdaptersAddresses(family, flags, NULL, pAddresses, &outBufLen); if (dwRetVal == NO_ERROR) {
// If successful, output some information from the data we received
pCurrAddresses = pAddresses;
while (pCurrAddresses) {
printf("\tLength of the IP_ADAPTER_ADDRESS struct: %ld\n",
pCurrAddresses->Length);
printf("\tIfIndex (IPv4 interface): %u\n", pCurrAddresses->IfIndex);
printf("\tAdapter name: %s\n", pCurrAddresses->AdapterName); pUnicast = pCurrAddresses->FirstUnicastAddress;
if (pUnicast != NULL) {
for (i = 0; pUnicast != NULL; i++)
pUnicast = pUnicast->Next;
printf("\tNumber of Unicast Addresses: %d\n", i);
} else
printf("\tNo Unicast Addresses\n"); pAnycast = pCurrAddresses->FirstAnycastAddress;
if (pAnycast) {
for (i = 0; pUnicast != NULL; i++)
pAnycast = pAnycast->Next;
printf("\tNumber of Anycast Addresses: %d\n", i);
} else
printf("\tNo Anycast Addresses\n"); pMulticast = pCurrAddresses->FirstMulticastAddress;
if (pMulticast) {
for (i = 0; pMulticast != NULL; i++)
pMulticast = pMulticast->Next;
printf("\tNumber of Multicast Addresses: %d\n", i);
} else
printf("\tNo Multicast Addresses\n"); pDnServer = pCurrAddresses->FirstDnsServerAddress;
if (pDnServer) {
for (i = 0; pDnServer != NULL; i++)
pDnServer = pDnServer->Next;
printf("\tNumber of DNS Server Addresses: %d\n", i);
} else
printf("\tNo DNS Server Addresses\n"); printf("\tDNS Suffix: %wS\n", pCurrAddresses->DnsSuffix);
printf("\tDescription: %wS\n", pCurrAddresses->Description);
printf("\tFriendly name: %wS\n", pCurrAddresses->FriendlyName); if (pCurrAddresses->PhysicalAddressLength != 0) {
printf("\tPhysical address: ");
for (i = 0; i < (int) pCurrAddresses->PhysicalAddressLength;
i++) {
if (i == (pCurrAddresses->PhysicalAddressLength - 1))
printf("%.2X\n",
(int) pCurrAddresses->PhysicalAddress[i]);
else
printf("%.2X-",
(int) pCurrAddresses->PhysicalAddress[i]);
}
}
printf("\tFlags: %ld\n", pCurrAddresses->Flags);
printf("\tMtu: %lu\n", pCurrAddresses->Mtu);
printf("\tIfType: %ld\n", pCurrAddresses->IfType);
printf("\tOperStatus: %ld\n", pCurrAddresses->OperStatus);
printf("\tIpv6IfIndex (IPv6 interface): %u\n",
pCurrAddresses->Ipv6IfIndex);
printf("\tZoneIndices (hex): ");
for (i = 0; i < 16; i++)
printf("%lx ", pCurrAddresses->ZoneIndices[i]);
printf("\n"); pPrefix = pCurrAddresses->FirstPrefix;
if (pPrefix) {
for (i = 0; pPrefix != NULL; i++)
pPrefix = pPrefix->Next;
printf("\tNumber of IP Adapter Prefix entries: %d\n", i);
} else
printf("\tNo IP Adapter Prefix entries\n"); printf("\n"); pCurrAddresses = pCurrAddresses->Next;
}
} else {
printf("Call to GetAdaptersAddresses failed with error: %d\n",
dwRetVal);
if (dwRetVal == ERROR_NO_DATA)
printf("\tNo addresses were found for the requested parameters\n");
else { if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dwRetVal, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) & lpMsgBuf, 0, NULL)) {
printf("\tError: %s", lpMsgBuf);
LocalFree(lpMsgBuf);
FREE(pAddresses);
exit(1);
}
}
}
FREE(pAddresses);
return 0;
}
UCHAR uRetCode ,retCode;
LANA_ENUM lenum;
int i = 0;
typedef struct _ASTAT_
{
ADAPTER_STATUS adapt;
NAME_BUFFER NameBuff [30];
}ASTAT, * PASTAT;
ASTAT Adapter;
memset(&Ncb, 0, sizeof(Ncb));
Ncb.ncb_command = NCBENUM;
Ncb.ncb_buffer = (UCHAR *)&lenum;
Ncb.ncb_length = sizeof(lenum);
Netbios(&Ncb);
for(i=0; i < lenum.length ;i++)
{
memset( &ncb1, 0, sizeof(ncb1) );
ncb1.ncb_command = NCBRESET;
ncb1.ncb_lana_num = lenum.lana[i]; // 指定网卡号
retCode = Netbios( &ncb1 );
memset( &ncb1, 0, sizeof(ncb1) );
ncb1.ncb_command = NCBASTAT;
ncb1.ncb_lana_num = lenum.lana[i]; // 指定网卡号 strcpy( (char *)ncb1.ncb_callname,"*" );
// 指定返回的信息存放的变量
ncb1.ncb_buffer = (unsigned char *) &Adapter;
ncb1.ncb_length = sizeof(Adapter); // 发送NCBASTAT命令以获取网卡的信息
retCode = Netbios( &ncb1 );
if ( retCode == 0 )
{
CString strMacAddr;
strMacAddr.Format( "%02X%02X%02X%02X%02X%02X",
Adapter.adapt.adapter_address[0],
Adapter.adapt.adapter_address[1],
Adapter.adapt.adapter_address[2],
Adapter.adapt.adapter_address[3],
Adapter.adapt.adapter_address[4],
Adapter.adapt.adapter_address[5] );
return strMacAddr;
}
}
return "";
IP_ADAPTER_INFO pAdapterInfo[10]; //IP_ADAPTER_INFO为网卡信息结构体,其中AdapterName表示网卡名,Address(BYTE[8])表示MAC地址,IpAddressList.IpAddress表示ip地址
DWORD dwBufLen = sizeof(IP_ADAPTER_INFO)*10;
DWORD dwStatus = GetAdaptersInfo(
pAdapterInfo, // [output] 指向接收数据缓冲指针
&dwBufLen);// [input] 缓冲区大小
assert(dwStatus== ERROR_SUCCESS); PIP_ADAPTER_INFO pAdapter = NULL;
DWORD dwRetVal = 0; pAdapter = pAdapterInfo;
while (pAdapter)
{
memcpy(AdapterMAC,pAdapter->Address,sizeof(pAdapter->Address));
return ;
}
pAdapter = pAdapter->Next;
}
return ;
void CGetMacAddrDlg::GetOneMac(int AdapterIndex)
{
NCB ncb;
UCHAR uRetCode;
ASTAT Adapter;
memset( &ncb, 0, sizeof(ncb) );
ncb.ncb_command = NCBRESET;
ncb.ncb_lana_num = AdapterIndex; // 指定网卡号
//首先对选定的网卡发送一个NCBRESET命令,以便进行初始化
uRetCode = Netbios( &ncb ); memset( &ncb, 0, sizeof(ncb) );
ncb.ncb_command = NCBASTAT;
ncb.ncb_lana_num = AdapterIndex; // 指定网卡号 strcpy( (char *)ncb.ncb_callname,"*" );
// 指定返回的信息存放的变量
ncb.ncb_buffer = (unsigned char *) &Adapter;
ncb.ncb_length = sizeof(Adapter); // 发送NCBASTAT命令以获取网卡的信息
uRetCode = Netbios( &ncb );
if ( uRetCode == 0 )
{
// 把网卡MAC地址格式化成常用的16进制形式,如0010-A4E4-5802
CString strMacAddr;
strMacAddr.Format( "%02X%02X-%02X%02X-%02X%02X\n",
Adapter.adapt.adapter_address[0],
Adapter.adapt.adapter_address[1],
Adapter.adapt.adapter_address[2],
Adapter.adapt.adapter_address[3],
Adapter.adapt.adapter_address[4],
Adapter.adapt.adapter_address[5] ); //将网卡地址和序号存入数组中
ADPTSTRCT AdptSt;
AdptSt.nIndex = AdapterIndex;
AdptSt.strMac = strMacAddr;
m_arrAdapters.Add(AdptSt);
}
}