forked from Mirror/Ryujinx
66 lines
2.4 KiB
C#
66 lines
2.4 KiB
C#
|
using System.Net.NetworkInformation;
|
|||
|
|
|||
|
namespace Ryujinx.Common.Utilities
|
|||
|
{
|
|||
|
public static class NetworkHelpers
|
|||
|
{
|
|||
|
private static (IPInterfaceProperties, UnicastIPAddressInformation) GetLocalInterface(NetworkInterface adapter, bool isPreferred)
|
|||
|
{
|
|||
|
IPInterfaceProperties properties = adapter.GetIPProperties();
|
|||
|
|
|||
|
if (isPreferred || (properties.GatewayAddresses.Count > 0 && properties.DnsAddresses.Count > 0))
|
|||
|
{
|
|||
|
foreach (UnicastIPAddressInformation info in properties.UnicastAddresses)
|
|||
|
{
|
|||
|
// Only accept an IPv4 address
|
|||
|
if (info.Address.GetAddressBytes().Length == 4)
|
|||
|
{
|
|||
|
return (properties, info);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return (null, null);
|
|||
|
}
|
|||
|
|
|||
|
public static (IPInterfaceProperties, UnicastIPAddressInformation) GetLocalInterface(string lanInterfaceId = "0")
|
|||
|
{
|
|||
|
if (!NetworkInterface.GetIsNetworkAvailable())
|
|||
|
{
|
|||
|
return (null, null);
|
|||
|
}
|
|||
|
|
|||
|
IPInterfaceProperties targetProperties = null;
|
|||
|
UnicastIPAddressInformation targetAddressInfo = null;
|
|||
|
|
|||
|
NetworkInterface[] interfaces = NetworkInterface.GetAllNetworkInterfaces();
|
|||
|
|
|||
|
string guid = lanInterfaceId;
|
|||
|
bool hasPreference = guid != "0";
|
|||
|
|
|||
|
foreach (NetworkInterface adapter in interfaces)
|
|||
|
{
|
|||
|
bool isPreferred = adapter.Id == guid;
|
|||
|
|
|||
|
// Ignore loopback and non IPv4 capable interface.
|
|||
|
if (isPreferred || (targetProperties == null && adapter.NetworkInterfaceType != NetworkInterfaceType.Loopback && adapter.Supports(NetworkInterfaceComponent.IPv4)))
|
|||
|
{
|
|||
|
(IPInterfaceProperties properties, UnicastIPAddressInformation info) = GetLocalInterface(adapter, isPreferred);
|
|||
|
|
|||
|
if (properties != null)
|
|||
|
{
|
|||
|
targetProperties = properties;
|
|||
|
targetAddressInfo = info;
|
|||
|
|
|||
|
if (isPreferred || !hasPreference)
|
|||
|
{
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return (targetProperties, targetAddressInfo);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|