Files
UnrealEngineUWP/Engine/Source/Runtime/Sockets/Private/Android/SocketSubsystemAndroid.cpp

222 lines
6.1 KiB
C++
Raw Normal View History

// Copyright 1998-2017 Epic Games, Inc. All Rights Reserved.
#include "SocketSubsystemAndroid.h"
Copying //UE4/Dev-Build to //UE4/Dev-Main (Source: //UE4/Dev-Build @ 3209340) #lockdown Nick.Penwarden #rb none ========================== MAJOR FEATURES + CHANGES ========================== Change 3209340 on 2016/11/23 by Ben.Marsh Convert UE4 codebase to an "include what you use" model - where every header just includes the dependencies it needs, rather than every source file including large monolithic headers like Engine.h and UnrealEd.h. Measured full rebuild times around 2x faster using XGE on Windows, and improvements of 25% or more for incremental builds and full rebuilds on most other platforms. * Every header now includes everything it needs to compile. * There's a CoreMinimal.h header that gets you a set of ubiquitous types from Core (eg. FString, FName, TArray, FVector, etc...). Most headers now include this first. * There's a CoreTypes.h header that sets up primitive UE4 types and build macros (int32, PLATFORM_WIN64, etc...). All headers in Core include this first, as does CoreMinimal.h. * Every .cpp file includes its matching .h file first. * This helps validate that each header is including everything it needs to compile. * No engine code includes a monolithic header such as Engine.h or UnrealEd.h any more. * You will get a warning if you try to include one of these from the engine. They still exist for compatibility with game projects and do not produce warnings when included there. * There have only been minor changes to our internal games down to accommodate these changes. The intent is for this to be as seamless as possible. * No engine code explicitly includes a precompiled header any more. * We still use PCHs, but they're force-included on the compiler command line by UnrealBuildTool instead. This lets us tune what they contain without breaking any existing include dependencies. * PCHs are generated by a tool to get a statistical amount of coverage for the source files using it, and I've seeded the new shared PCHs to contain any header included by > 15% of source files. Tool used to generate this transform is at Engine\Source\Programs\IncludeTool. [CL 3209342 by Ben Marsh in Main branch]
2016-11-23 15:48:37 -05:00
#include "SocketSubsystemModule.h"
#include "IPAddress.h"
#include "Misc/Parse.h"
#include "Misc/CommandLine.h"
#include "ModuleManager.h"
Copying //UE4/Dev-Mobile to //UE4/Main (Source: //UE4/Dev-Mobile @ 2945914) ========================== MAJOR FEATURES + CHANGES ========================== Change 2911743 on 2016/03/16 by Allan.Bentham Fix broken tonemapper when using 32bpp encoded HDR. Fixes UE-28359 Cleaned up some ronin integration hacks from ronin. Change 2912053 on 2016/03/16 by Peter.Sauerbrei disable Vulkan in Win32 builds for now #codereview rolando.caloca #jira UE-28465 Change 2914512 on 2016/03/18 by Dmitriy.Dyomin Fixed crash on Nexus5 with Android 4.4.2 when TonemapperFilm is enabled Change 2914944 on 2016/03/18 by Allan.Bentham Fix es2 tonemap flip. Fixes UE-25148 Change 2915248 on 2016/03/18 by Chris.Babcock Updates to support NDK r11 #jira UE-28529 #ue4 #android Change 2919192 on 2016/03/22 by Chris.Babcock NDK level set above 19 forces minSdkVersion to 21 or above to prevent installing on unsupported devices #jira UE-28408 #ue4 #android #codereview Jack.Porter Change 2919591 on 2016/03/23 by Allan.Bentham Merge ronin's Gaussian DoF to 4.11's dof changes. Gaussian DoF will use a single recombine pass with ES31 devices or if no separate translucency is used on SM4+. Added permutation to exclude separate translucency from Gaussian recombine shader when not in use. #codereview martin.mittring Change 2920758 on 2016/03/24 by Dmitriy.Dyomin Fixed: shifting lighting samples octree https://udn.unrealengine.com/questions/276026/lighting-samples-visualization-not-working-with-le.html Change 2920793 on 2016/03/24 by Dmitriy.Dyomin Fixed: When sub-level set to be unloaded but with visbility state set to true, ULevelStreaming::IsStreamingStatePending returns wrong value #jira UE-26426 Change 2920981 on 2016/03/24 by Dmitriy.Dyomin GPU particles support for iOS Metal (A8+ only) #jira UE-11067 #jira UE-28514 #codereview Jack.Porter Change 2921383 on 2016/03/24 by Allan.Bentham Fix inverted image on device when framebuffer fetch/bViewRectSource is not used. #codereview jack.porter Change 2925694 on 2016/03/29 by Dmitriy.Dyomin Fixed: GPU particles and bloom on S7 Mali Change 2927065 on 2016/03/29 by Chris.Babcock Set the DT_SONAME field in linker (stops warning toast) #ue4 #android #codereview Jack.Porter Change 2927375 on 2016/03/30 by Jack.Porter Fixed localization for placement mode Cube, Sphere, Cylinder and Cone Change 2928643 on 2016/03/30 by Jack.Porter Fixed bug introdued by Ronin merge with DepthOfFieldScale setting being locked for BokehDOF #code_review: allan.bentham Change 2932773 on 2016/04/04 by Jack.Porter Reapply android Vulkan version fixes Change 2932853 on 2016/04/05 by Jack.Porter Enable VULKAN_CLEAR_SURFACE_ON_CREATE on Android to prevent assertion Change 2932998 on 2016/04/05 by Jack.Porter Native web browser widget on iOS #jira UEMOB-20 Change 2933420 on 2016/04/05 by Chris.Babcock Removed hard-coded bUseUnityBuild in UBT for Android (contributed by kosz78) #jira UE-29066 #pr #2236 #ue4 #android Change 2934315 on 2016/04/05 by Chris.Babcock Allow Android to act as server with OnlineSubsystemNull (contributed by psychogony) #jira UE-23937 #PR #1820 #ue4 #android #codereview Ryan.Gerleve Change 2935038 on 2016/04/06 by Chris.Babcock Fix OpenGLES31 compile error #ue4 #android #codereview Jack.Porter Change 2936288 on 2016/04/07 by Allan.Bentham Planar reflection captures for mobile. (UE-27426) Added mobile planar reflection flag to material. #codereview jack.porter, daniel.wright Change 2936297 on 2016/04/07 by Allan.Bentham Missed file. Planar reflection captures for mobile. (UE-27426) #codereview jack.porter, daniel.wright Change 2937763 on 2016/04/08 by Dmitriy.Dyomin Fix InstancedStaticMesh batches for ES2 (contributed by Grimmick) GitHub #2031 #jira UE-26576 #codereview Jack.Porter Change 2937863 on 2016/04/08 by Jack.Porter Merged Ronin CLs 2840392, 2860028 Allow vertex texture fetches on ES2 (requires absolute mip level) Change 2938461 on 2016/04/08 by Chris.Babcock Write Android uninstall batch files #ue4 #android Change 2939679 on 2016/04/11 by Allan.Bentham Remove bStationaryLightUsesCSMForMovableShadows from light component's UI. renamed proxy equivalent and infer its state from Inset Shadows For Movable Objects #codereview jack.porter, daniel.wright Change 2939887 on 2016/04/11 by Chris.Babcock Android ARM64 libraries #jira UEPLAT-1268 #ue4 #android Change 2940125 on 2016/04/11 by Chris.Babcock Added requirements to Arm64 and x86_64 tooltips Change 2941051 on 2016/04/12 by Allan.Bentham Fix for inverted RG channels when using filmic tonemapper with ES2. #codereview jack.porter Change 2942523 on 2016/04/13 by Chris.Babcock Add cxa_demangle build.cs instead of hiding dependency in UEBuildAndroid.cs #ue4 #android #codereview Josh.Adams Change 2942578 on 2016/04/13 by Chris.Babcock Add cxademangle dependency to Core for Android #ue4 #android #codereview Josh.Adams Change 2942997 on 2016/04/13 by Chris.Babcock Run Ant with -quiet first and run again without if there is an error for the log #ue4 #android #codereview Josh.Adams Change 2943320 on 2016/04/14 by Jack.Porter Fixed planar reflection merge errors Change 2943352 on 2016/04/14 by Jack.Porter Fix NAME_VULKAN_ES3_1_ANDROID shader format name #codereview: Rolando.Coloca Change 2943367 on 2016/04/14 by Dmitriy.Dyomin Added cvars to add or strip specific GL extensions from a driver reported extensions string #jira UE-29467 Change 2943425 on 2016/04/14 by Dmitriy.Dyomin Better logging of MobileHDR mode Change 2943461 on 2016/04/14 by Dmitriy.Dyomin Fixing HDR rendering and bloom on Galaxy S7 Change 2943493 on 2016/04/14 by Dmitriy.Dyomin Better HDR fix for devices with ES3 support Change 2943855 on 2016/04/14 by Allan.Bentham Mobile planar reflections. - currently only supports opaque materials #codereview jack.porter Change 2944721 on 2016/04/14 by Chris.Babcock Allow Vulkan-only Android builds #ue4 #android #codereview Allan.Bentham,Jack.Porter Change 2944771 on 2016/04/14 by Dmitriy.Dyomin Fixed: mesh particles crash in ES2 Change 2944827 on 2016/04/15 by Dmitriy.Dyomin Fixed: GPU particles not working on S6 with Android 6.0.1 Change 2944836 on 2016/04/15 by Jack.Porter Disable FX system calls in forward renderer when particles showflag is off Change 2944840 on 2016/04/15 by Jack.Porter Re-enabled non-radial TDeferredLightVS on ES2 for planar and put #if FEATURE_LEVEL >= FEATURE_LEVEL_SM4 around the radial shader code which was tripping up ES2. #codereview: Allan.Bentham, Chris.Babcock, Daniel.Wright Change 2944914 on 2016/04/15 by Jack.Porter Device profiles to detect Galaxy S7 Mali and Adreno variants in Vulkan mode Change 2945020 on 2016/04/15 by Gareth.Martin Cloning changes across from Dev-Landscape to Dev-Mobile due to feature deadline for 4.12. Change 2943560 on 2016/04/14 by Gareth.Martin Added ability to expand landscape bounds #jira UE-28928 #jira UE-25230 Change 2943538 on 2016/04/14 by Gareth.Martin Fix a crash with saving a level >2GB in size. There may still be other crashes with >2GB levels. Change 2943477 on 2016/04/14 by Gareth.Martin Fixed LODFalloff setting on landscape getting reset when using the "Change Landscape Component Size" tool Also moved all the LOD settings together in LandscapeProxy.h because it was messy Change 2942113 on 2016/04/13 by Gareth.Martin Updating comment to clarify behaviour of Foliage Align-To-Normal when Random-Yaw is disabled. Change 2941030 on 2016/04/12 by Gareth.Martin Cleanup and commenting Change 2940994 on 2016/04/12 by Gareth.Martin Implement random scale option for Landscape Grass. #jira UE-25743 Change 2940993 on 2016/04/12 by Gareth.Martin Remove unused BuildFlatTree function from HierarchicalInstancedStaticMeshComponent Change 2940150 on 2016/04/11 by Gareth.Martin Harden UHierarchicalInstancedStaticMeshComponent::UpdateInstanceTransform Change 2940101 on 2016/04/11 by Gareth.Martin Additional checks for bad static mesh when building the HISMC tree Change 2945560 on 2016/04/15 by Rolando.Caloca DM - Fix for newer Vulkan sdks Change 2945638 on 2016/04/15 by Chris.Babcock Fix permissions on uninstall script on Mac #jira UE-29236 #ue4 #android #lockdown Jack.Porter Change 2945856 on 2016/04/15 by Rolando.Caloca DM - vk - Fix mapped allocations on mobile #lockdown nick.penwarden [CL 2945995 by Chris Babcock in Main branch]
2016-04-15 18:19:26 -04:00
#include <sys/ioctl.h>
#include <net/if.h>
FSocketSubsystemAndroid* FSocketSubsystemAndroid::SocketSingleton = NULL;
FName CreateSocketSubsystem( FSocketSubsystemModule& SocketSubsystemModule )
{
FName SubsystemName(TEXT("ANDROID"));
// Create and register our singleton factor with the main online subsystem for easy access
FSocketSubsystemAndroid* SocketSubsystem = FSocketSubsystemAndroid::Create();
FString Error;
if (SocketSubsystem->Init(Error))
{
SocketSubsystemModule.RegisterSocketSubsystem(SubsystemName, SocketSubsystem);
return SubsystemName;
}
else
{
FSocketSubsystemAndroid::Destroy();
return NAME_None;
}
}
void DestroySocketSubsystem( FSocketSubsystemModule& SocketSubsystemModule )
{
SocketSubsystemModule.UnregisterSocketSubsystem(FName(TEXT("ANDROID")));
FSocketSubsystemAndroid::Destroy();
}
/**
* Singleton interface for the Android socket subsystem
* @return the only instance of the Android socket subsystem
*/
FSocketSubsystemAndroid* FSocketSubsystemAndroid::Create()
{
if (SocketSingleton == NULL)
{
SocketSingleton = new FSocketSubsystemAndroid();
}
return SocketSingleton;
}
/**
* Destroy the singleton Android socket subsystem
*/
void FSocketSubsystemAndroid::Destroy()
{
if (SocketSingleton != NULL)
{
SocketSingleton->Shutdown();
delete SocketSingleton;
SocketSingleton = NULL;
}
}
/**
* Does Android platform initialization of the sockets library
*
* @param Error a string that is filled with error information
*
* @return TRUE if initialized ok, FALSE otherwise
*/
bool FSocketSubsystemAndroid::Init(FString& Error)
{
return true;
}
/**
* Performs Android specific socket clean up
*/
void FSocketSubsystemAndroid::Shutdown(void)
{
}
/**
* @return Whether the device has a properly configured network device or not
*/
bool FSocketSubsystemAndroid::HasNetworkDevice()
{
return true;
}
Copying //UE4/Dev-Mobile to //UE4/Main (Source: //UE4/Dev-Mobile @ 2945914) ========================== MAJOR FEATURES + CHANGES ========================== Change 2911743 on 2016/03/16 by Allan.Bentham Fix broken tonemapper when using 32bpp encoded HDR. Fixes UE-28359 Cleaned up some ronin integration hacks from ronin. Change 2912053 on 2016/03/16 by Peter.Sauerbrei disable Vulkan in Win32 builds for now #codereview rolando.caloca #jira UE-28465 Change 2914512 on 2016/03/18 by Dmitriy.Dyomin Fixed crash on Nexus5 with Android 4.4.2 when TonemapperFilm is enabled Change 2914944 on 2016/03/18 by Allan.Bentham Fix es2 tonemap flip. Fixes UE-25148 Change 2915248 on 2016/03/18 by Chris.Babcock Updates to support NDK r11 #jira UE-28529 #ue4 #android Change 2919192 on 2016/03/22 by Chris.Babcock NDK level set above 19 forces minSdkVersion to 21 or above to prevent installing on unsupported devices #jira UE-28408 #ue4 #android #codereview Jack.Porter Change 2919591 on 2016/03/23 by Allan.Bentham Merge ronin's Gaussian DoF to 4.11's dof changes. Gaussian DoF will use a single recombine pass with ES31 devices or if no separate translucency is used on SM4+. Added permutation to exclude separate translucency from Gaussian recombine shader when not in use. #codereview martin.mittring Change 2920758 on 2016/03/24 by Dmitriy.Dyomin Fixed: shifting lighting samples octree https://udn.unrealengine.com/questions/276026/lighting-samples-visualization-not-working-with-le.html Change 2920793 on 2016/03/24 by Dmitriy.Dyomin Fixed: When sub-level set to be unloaded but with visbility state set to true, ULevelStreaming::IsStreamingStatePending returns wrong value #jira UE-26426 Change 2920981 on 2016/03/24 by Dmitriy.Dyomin GPU particles support for iOS Metal (A8+ only) #jira UE-11067 #jira UE-28514 #codereview Jack.Porter Change 2921383 on 2016/03/24 by Allan.Bentham Fix inverted image on device when framebuffer fetch/bViewRectSource is not used. #codereview jack.porter Change 2925694 on 2016/03/29 by Dmitriy.Dyomin Fixed: GPU particles and bloom on S7 Mali Change 2927065 on 2016/03/29 by Chris.Babcock Set the DT_SONAME field in linker (stops warning toast) #ue4 #android #codereview Jack.Porter Change 2927375 on 2016/03/30 by Jack.Porter Fixed localization for placement mode Cube, Sphere, Cylinder and Cone Change 2928643 on 2016/03/30 by Jack.Porter Fixed bug introdued by Ronin merge with DepthOfFieldScale setting being locked for BokehDOF #code_review: allan.bentham Change 2932773 on 2016/04/04 by Jack.Porter Reapply android Vulkan version fixes Change 2932853 on 2016/04/05 by Jack.Porter Enable VULKAN_CLEAR_SURFACE_ON_CREATE on Android to prevent assertion Change 2932998 on 2016/04/05 by Jack.Porter Native web browser widget on iOS #jira UEMOB-20 Change 2933420 on 2016/04/05 by Chris.Babcock Removed hard-coded bUseUnityBuild in UBT for Android (contributed by kosz78) #jira UE-29066 #pr #2236 #ue4 #android Change 2934315 on 2016/04/05 by Chris.Babcock Allow Android to act as server with OnlineSubsystemNull (contributed by psychogony) #jira UE-23937 #PR #1820 #ue4 #android #codereview Ryan.Gerleve Change 2935038 on 2016/04/06 by Chris.Babcock Fix OpenGLES31 compile error #ue4 #android #codereview Jack.Porter Change 2936288 on 2016/04/07 by Allan.Bentham Planar reflection captures for mobile. (UE-27426) Added mobile planar reflection flag to material. #codereview jack.porter, daniel.wright Change 2936297 on 2016/04/07 by Allan.Bentham Missed file. Planar reflection captures for mobile. (UE-27426) #codereview jack.porter, daniel.wright Change 2937763 on 2016/04/08 by Dmitriy.Dyomin Fix InstancedStaticMesh batches for ES2 (contributed by Grimmick) GitHub #2031 #jira UE-26576 #codereview Jack.Porter Change 2937863 on 2016/04/08 by Jack.Porter Merged Ronin CLs 2840392, 2860028 Allow vertex texture fetches on ES2 (requires absolute mip level) Change 2938461 on 2016/04/08 by Chris.Babcock Write Android uninstall batch files #ue4 #android Change 2939679 on 2016/04/11 by Allan.Bentham Remove bStationaryLightUsesCSMForMovableShadows from light component's UI. renamed proxy equivalent and infer its state from Inset Shadows For Movable Objects #codereview jack.porter, daniel.wright Change 2939887 on 2016/04/11 by Chris.Babcock Android ARM64 libraries #jira UEPLAT-1268 #ue4 #android Change 2940125 on 2016/04/11 by Chris.Babcock Added requirements to Arm64 and x86_64 tooltips Change 2941051 on 2016/04/12 by Allan.Bentham Fix for inverted RG channels when using filmic tonemapper with ES2. #codereview jack.porter Change 2942523 on 2016/04/13 by Chris.Babcock Add cxa_demangle build.cs instead of hiding dependency in UEBuildAndroid.cs #ue4 #android #codereview Josh.Adams Change 2942578 on 2016/04/13 by Chris.Babcock Add cxademangle dependency to Core for Android #ue4 #android #codereview Josh.Adams Change 2942997 on 2016/04/13 by Chris.Babcock Run Ant with -quiet first and run again without if there is an error for the log #ue4 #android #codereview Josh.Adams Change 2943320 on 2016/04/14 by Jack.Porter Fixed planar reflection merge errors Change 2943352 on 2016/04/14 by Jack.Porter Fix NAME_VULKAN_ES3_1_ANDROID shader format name #codereview: Rolando.Coloca Change 2943367 on 2016/04/14 by Dmitriy.Dyomin Added cvars to add or strip specific GL extensions from a driver reported extensions string #jira UE-29467 Change 2943425 on 2016/04/14 by Dmitriy.Dyomin Better logging of MobileHDR mode Change 2943461 on 2016/04/14 by Dmitriy.Dyomin Fixing HDR rendering and bloom on Galaxy S7 Change 2943493 on 2016/04/14 by Dmitriy.Dyomin Better HDR fix for devices with ES3 support Change 2943855 on 2016/04/14 by Allan.Bentham Mobile planar reflections. - currently only supports opaque materials #codereview jack.porter Change 2944721 on 2016/04/14 by Chris.Babcock Allow Vulkan-only Android builds #ue4 #android #codereview Allan.Bentham,Jack.Porter Change 2944771 on 2016/04/14 by Dmitriy.Dyomin Fixed: mesh particles crash in ES2 Change 2944827 on 2016/04/15 by Dmitriy.Dyomin Fixed: GPU particles not working on S6 with Android 6.0.1 Change 2944836 on 2016/04/15 by Jack.Porter Disable FX system calls in forward renderer when particles showflag is off Change 2944840 on 2016/04/15 by Jack.Porter Re-enabled non-radial TDeferredLightVS on ES2 for planar and put #if FEATURE_LEVEL >= FEATURE_LEVEL_SM4 around the radial shader code which was tripping up ES2. #codereview: Allan.Bentham, Chris.Babcock, Daniel.Wright Change 2944914 on 2016/04/15 by Jack.Porter Device profiles to detect Galaxy S7 Mali and Adreno variants in Vulkan mode Change 2945020 on 2016/04/15 by Gareth.Martin Cloning changes across from Dev-Landscape to Dev-Mobile due to feature deadline for 4.12. Change 2943560 on 2016/04/14 by Gareth.Martin Added ability to expand landscape bounds #jira UE-28928 #jira UE-25230 Change 2943538 on 2016/04/14 by Gareth.Martin Fix a crash with saving a level >2GB in size. There may still be other crashes with >2GB levels. Change 2943477 on 2016/04/14 by Gareth.Martin Fixed LODFalloff setting on landscape getting reset when using the "Change Landscape Component Size" tool Also moved all the LOD settings together in LandscapeProxy.h because it was messy Change 2942113 on 2016/04/13 by Gareth.Martin Updating comment to clarify behaviour of Foliage Align-To-Normal when Random-Yaw is disabled. Change 2941030 on 2016/04/12 by Gareth.Martin Cleanup and commenting Change 2940994 on 2016/04/12 by Gareth.Martin Implement random scale option for Landscape Grass. #jira UE-25743 Change 2940993 on 2016/04/12 by Gareth.Martin Remove unused BuildFlatTree function from HierarchicalInstancedStaticMeshComponent Change 2940150 on 2016/04/11 by Gareth.Martin Harden UHierarchicalInstancedStaticMeshComponent::UpdateInstanceTransform Change 2940101 on 2016/04/11 by Gareth.Martin Additional checks for bad static mesh when building the HISMC tree Change 2945560 on 2016/04/15 by Rolando.Caloca DM - Fix for newer Vulkan sdks Change 2945638 on 2016/04/15 by Chris.Babcock Fix permissions on uninstall script on Mac #jira UE-29236 #ue4 #android #lockdown Jack.Porter Change 2945856 on 2016/04/15 by Rolando.Caloca DM - vk - Fix mapped allocations on mobile #lockdown nick.penwarden [CL 2945995 by Chris Babcock in Main branch]
2016-04-15 18:19:26 -04:00
/**
* @return Label explicitly as Android as behavior is slightly different for BSD @refer GetLocalHostAddr
*/
const TCHAR* FSocketSubsystemAndroid::GetSocketAPIName() const
{
return TEXT("BSD_Android");
}
TSharedRef<FInternetAddr> FSocketSubsystemAndroid::GetLocalHostAddr(FOutputDevice& Out, bool& bCanBindAll)
{
// Get parent address first
TSharedRef<FInternetAddr> Addr = FSocketSubsystemBSD::GetLocalHostAddr(Out, bCanBindAll);
// If the address is not a loopback one (or none), return it.
// NOTE:
// Depreciated function gethostname() returns 'localhost' on (all?) Android devices
// Which in turn means that FSocketSubsystemBSD::GetLocalHostAddr() resolves to 127.0.0.1
// Getting info from android.net.wifi.WifiManager is a little messy due to UE4 modular architecture and JNI
// IPv4 code using ioctl(.., SIOCGIFCONF, ..) actually based on FSocketSubsytemLinux::GetLocalHostAddr works fine for now...
//
// Also NOTE: Network can flip out behind applications back when connectivity changes. eg. Move out of wifi range.
// This seems to recover OK between matches as subsystems are reinited each session Host/Join.
uint32 ParentIp = 0;
Addr->GetIp(ParentIp); // will return in host order
if (ParentIp != 0 && (ParentIp & 0xff000000) != 0x7f000000)
{
return Addr;
}
// If superclass got the address from command line, honor that override
TCHAR Home[256] = TEXT("");
if (FParse::Value(FCommandLine::Get(), TEXT("MULTIHOME="), Home, ARRAY_COUNT(Home)))
{
TSharedRef<FInternetAddr> TempAddr = CreateInternetAddr();
bool bIsValid = false;
TempAddr->SetIp(Home, bIsValid);
if (bIsValid)
{
UE_LOG(LogSockets, Warning, TEXT("FSocketSubsystemAndroid::GetLocalHostAddr Using MULTIHOME"));
return Addr;
}
}
// We need to go deeper...
int TempSocket = socket(PF_INET, SOCK_STREAM, 0);
if (TempSocket)
{
ifreq IfReqs[8];
ifconf IfConfig;
FMemory::Memzero(IfConfig);
IfConfig.ifc_req = IfReqs;
IfConfig.ifc_len = sizeof(IfReqs);
int Result = ioctl(TempSocket, SIOCGIFCONF, &IfConfig);
if (Result == 0)
{
int32 WifiAddress = 0;
int32 CellularAddress = 0;
int32 OtherAddress = 0;
for (int32 IdxReq = 0; IdxReq < ARRAY_COUNT(IfReqs); ++IdxReq)
{
// Examine interfaces that are up and not loop back
int ResultFlags = ioctl(TempSocket, SIOCGIFFLAGS, &IfReqs[IdxReq]);
if (ResultFlags == 0 &&
(IfReqs[IdxReq].ifr_flags & IFF_UP) &&
(IfReqs[IdxReq].ifr_flags & IFF_LOOPBACK) == 0)
{
if (strcmp(IfReqs[IdxReq].ifr_name, "wlan0") == 0)
{
// 'Usually' wifi, Prefer wifi
WifiAddress = reinterpret_cast<sockaddr_in *>(&IfReqs[IdxReq].ifr_addr)->sin_addr.s_addr;
break;
}
else if (strcmp(IfReqs[IdxReq].ifr_name, "rmnet0") == 0)
{
// 'Usually' cellular
CellularAddress = reinterpret_cast<sockaddr_in *>(&IfReqs[IdxReq].ifr_addr)->sin_addr.s_addr;
}
else if (OtherAddress == 0)
{
// First alternate found
OtherAddress = reinterpret_cast<sockaddr_in *>(&IfReqs[IdxReq].ifr_addr)->sin_addr.s_addr;
}
}
}
// Prioritize results found
if (WifiAddress != 0)
{
// Prefer Wifi
Addr->SetIp(ntohl(WifiAddress));
UE_LOG(LogSockets, Log, TEXT("(%s) Wifi Adapter IP %s"), GetSocketAPIName(), *Addr->ToString(false));
}
else if (CellularAddress != 0)
{
// Then cellular
Addr->SetIp(ntohl(CellularAddress));
UE_LOG(LogSockets, Log, TEXT("(%s) Cellular Adapter IP %s"), GetSocketAPIName(), *Addr->ToString(false));
}
else if (OtherAddress != 0)
{
// Then whatever else was found
Addr->SetIp(ntohl(OtherAddress));
UE_LOG(LogSockets, Log, TEXT("(%s) Adapter IP %s"), GetSocketAPIName(), *Addr->ToString(false));
}
else
{
// Give up
Addr->SetIp(0x7f000001); // 127.0.0.1
UE_LOG(LogSockets, Warning, TEXT("(%s) NO 'UP' ADAPTER FOUND! using: %s"), GetSocketAPIName(), *Addr->ToString(false));
}
}
else
{
int ErrNo = errno;
UE_LOG(LogSockets, Warning, TEXT("ioctl( ,SIOGCIFCONF, ) failed, errno=%d (%s)"), ErrNo, ANSI_TO_TCHAR(strerror(ErrNo)));
}
close(TempSocket);
}
return Addr;
}