ue4 4.16版本中获取MAC地址的接口为FGenericPlatformMisc::GetMacAddressString
此接口在windows平台的实现是调用Win32接口GetAdaptersInfo,然后返回第一个mac地址,但如果需要获取所有mac地址,此接口就不满足了,但很容易根据此接口实现一个获取所有mac地址的接口,具体代码如下:
TArray<FString> FWindowsPlatformMisc::GetAllMacAddress()
{
TArray<FString> Addresses;
IP_ADAPTER_INFO IpAddresses[16];
ULONG OutBufferLength = sizeof(IP_ADAPTER_INFO) * 16;
// Read the adapters
uint32 RetVal = GetAdaptersInfo(IpAddresses, &OutBufferLength);
if (RetVal == NO_ERROR)
{
PIP_ADAPTER_INFO AdapterList = IpAddresses;
// Walk the set of addresses copying each one
while (AdapterList)
{
// If there is an address to read
if (AdapterList->AddressLength > 0)
{
TArray<uint8> MacAddr;
// Copy the data and say we did
MacAddr.AddZeroed(AdapterList->AddressLength);
FMemory::Memcpy(MacAddr.GetData(), AdapterList->Address, AdapterList->AddressLength);
FString Address;
for (TArray<uint8>::TConstIterator it(MacAddr); it; ++it)
{
Address += FString::Printf(TEXT("%02x"), *it);
}
Addresses.Add(Address);
}
AdapterList = AdapterList->Next;
}
}
return Addresses;
}
此接口可以返回所有mac地址(经测试不包含禁用网卡的mac地址)
另外工作中需要返回所有mac地址生成的mac地址,来代表mac地址的唯一标示,代码如下:
FString UShooterGameInstance::GetMacAddress()
{
const int MAC_ADDRESS_BYTE_LEN = 6;
TArray<uint8> MacAddr;
MacAddr.AddZeroed(MAC_ADDRESS_BYTE_LEN);
TArray<FString> Addresses = FWindowsPlatformMisc::GetAllMacAddress();
for (TArray<FString>::TConstIterator it(Addresses); it; ++it)
{
FString Address = *it;
if (Address.Len() == MAC_ADDRESS_BYTE_LEN*2)
{
for (int Index = 0; Index < MAC_ADDRESS_BYTE_LEN; ++Index)
{
TCHAR* End = nullptr;
TCHAR ConvBuffer[3];
ConvBuffer[2] = TEXT('\0');
ConvBuffer[0] = Address[Index*2];
ConvBuffer[1] = Address[Index*2+1];
uint8 Num = FCString::Strtoi(ConvBuffer, &End, 16);
MacAddr[Index] += Num;
}
UE_LOG(LogOnline, Warning, TEXT("Mac Address:%s"), *Address);
}
}
FString Result;
for (TArray<uint8>::TConstIterator it(MacAddr); it; ++it)
{
Result += FString::Printf(TEXT("%02x"), *it);
}
UE_LOG(LogOnline, Warning, TEXT("After Caculate Mac Address:%s"), *Result);
return Result;
}