@ -22,7 +22,7 @@ namespace Emby.Common.Implementations.Networking
Logger = logger ;
}
private List < IPAddress > _localIpAddresses ;
private List < IPAddress > _localIpAddresses ;
private readonly object _localIpAddressSyncLock = new object ( ) ;
/// <summary>
@ -51,24 +51,24 @@ namespace Emby.Common.Implementations.Networking
return _localIpAddresses ;
}
private IEnumerable < IPAddress > GetLocalIpAddressesInternal ( )
private IEnumerable < IPAddress > GetLocalIpAddressesInternal ( )
{
var list = GetIPsDefault ( )
. ToList ( ) ;
if ( list . Count = = 0 )
{
list . AddRange ( GetLocalIpAddressesFallback ( ) . Result ) ;
list . AddRange ( GetLocalIpAddressesFallback ( ) . Result ) ;
}
return list . Where ( FilterIpAddress ) . DistinctBy ( i = > i . ToString ( ) ) ;
return list . Where ( FilterIpAddress ) . DistinctBy ( i = > i . ToString ( ) ) ;
}
private bool FilterIpAddress ( IPAddress address )
private bool FilterIpAddress ( IPAddress address )
{
var addressString = address . ToString ( ) ;
var addressString = address . ToString ( ) ;
if ( addressString . StartsWith ( "169." , StringComparison . OrdinalIgnoreCase ) )
if ( addressString . StartsWith ( "169." , StringComparison . OrdinalIgnoreCase ) )
{
return false ;
}
@ -156,12 +156,12 @@ namespace Emby.Common.Implementations.Networking
{
var prefix = addressString . Substring ( 0 , lengthMatch ) ;
if ( GetLocalIpAddresses ( ) . Any ( i = > i . ToString ( ) . StartsWith ( prefix , StringComparison . OrdinalIgnoreCase ) ) )
if ( GetLocalIpAddresses ( ) . Any ( i = > i . ToString ( ) . StartsWith ( prefix , StringComparison . OrdinalIgnoreCase ) ) )
{
return true ;
}
}
}
}
else if ( resolveHost )
{
Uri uri ;
@ -200,45 +200,50 @@ namespace Emby.Common.Implementations.Networking
return Dns . GetHostAddressesAsync ( hostName ) ;
}
private List < IPAddress > GetIPsDefault ( )
{
NetworkInterface [ ] interfaces ;
private List < IPAddress > GetIPsDefault ( )
{
NetworkInterface [ ] interfaces ;
try
{
interfaces = NetworkInterface . GetAllNetworkInterfaces ( ) ;
}
catch ( Exception ex )
{
Logger . ErrorException ( "Error in GetAllNetworkInterfaces" , ex ) ;
return new List < IPAddress > ( ) ;
}
try
{
var validStatuses = new [ ] { OperationalStatus . Up , OperationalStatus . Unknown } ;
return interfaces . SelectMany ( network = > {
interfaces = NetworkInterface . GetAllNetworkInterfaces ( )
. Where ( i = > validStatuses . Contains ( i . OperationalStatus ) )
. ToArray ( ) ;
}
catch ( Exception ex )
{
Logger . ErrorException ( "Error in GetAllNetworkInterfaces" , ex ) ;
return new List < IPAddress > ( ) ;
}
return interfaces . SelectMany ( network = >
{
try
{
try
{
Logger . Debug ( "Querying interface: {0}. Type: {1}. Status: {2}" , network . Name , network . NetworkInterfaceType , network . OperationalStatus ) ;
var properties = network . GetIPProperties ( ) ;
var properties = network . GetIPProperties ( ) ;
return properties . UnicastAddresses
return properties . UnicastAddresses
. Where ( i = > i . IsDnsEligible )
. Select ( i = > i . Address )
. Where ( i = > i . AddressFamily = = AddressFamily . InterNetwork )
. ToList ( ) ;
}
catch ( Exception ex )
{
Logger . ErrorException ( "Error querying network interface" , ex ) ;
return new List < IPAddress > ( ) ;
}
} ) . DistinctBy ( i = > i . ToString ( ) )
. ToList ( ) ;
}
private async Task < IEnumerable < IPAddress > > GetLocalIpAddressesFallback ( )
. ToList ( ) ;
}
catch ( Exception ex )
{
Logger . ErrorException ( "Error querying network interface" , ex ) ;
return new List < IPAddress > ( ) ;
}
} ) . DistinctBy ( i = > i . ToString ( ) )
. ToList ( ) ;
}
private async Task < IEnumerable < IPAddress > > GetLocalIpAddressesFallback ( )
{
var host = await Dns . GetHostEntryAsync ( Dns . GetHostName ( ) ) . ConfigureAwait ( false ) ;
@ -310,7 +315,7 @@ namespace Emby.Common.Implementations.Networking
string [ ] values = endpointstring . Split ( new char [ ] { ':' } ) ;
IPAddress ipaddy ;
int port = - 1 ;
//check if we have an IPv6 or ports
if ( values . Length < = 2 ) // ipv4 or hostname
{