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; }