ue4获取所有mac地址

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

猜你喜欢

转载自blog.csdn.net/xiaozhi0999/article/details/80737799
UE4