Przeglądaj źródła

Merge pull request #5345 from BaronGreenback/IP6Fix

Dual IP4 / IP6 server fails on non-windows platforms

(cherry picked from commit 8615847a8aba1f504b184e79907e6885215ffdaa)
Signed-off-by: Joshua M. Boniface <joshua@boniface.me>
dkanada 4 lat temu
rodzic
commit
7545b1286b

+ 16 - 5
Jellyfin.Networking/Manager/NetworkManager.cs

@@ -285,14 +285,25 @@ namespace Jellyfin.Networking.Manager
                 // No bind address and no exclusions, so listen on all interfaces.
                 // No bind address and no exclusions, so listen on all interfaces.
                 Collection<IPObject> result = new Collection<IPObject>();
                 Collection<IPObject> result = new Collection<IPObject>();
 
 
-                if (IsIP4Enabled)
+                if (IsIP6Enabled && IsIP4Enabled)
+                {
+                    // Kestrel source code shows it uses Sockets.DualMode - so this also covers IPAddress.Any
+                    result.AddItem(IPAddress.IPv6Any);
+                }
+                else if (IsIP4Enabled)
                 {
                 {
                     result.AddItem(IPAddress.Any);
                     result.AddItem(IPAddress.Any);
                 }
                 }
-
-                if (IsIP6Enabled)
+                else if (IsIP6Enabled)
                 {
                 {
-                    result.AddItem(IPAddress.IPv6Any);
+                    // Cannot use IPv6Any as Kestrel will bind to IPv4 addresses.
+                    foreach (var iface in _interfaceAddresses)
+                    {
+                        if (iface.AddressFamily == AddressFamily.InterNetworkV6)
+                        {
+                            result.AddItem(iface.Address);
+                        }
+                    }
                 }
                 }
 
 
                 return result;
                 return result;
@@ -414,7 +425,7 @@ namespace Jellyfin.Networking.Manager
             }
             }
 
 
             // There isn't any others, so we'll use the loopback.
             // There isn't any others, so we'll use the loopback.
-            result = IsIP6Enabled ? "::" : "127.0.0.1";
+            result = IsIP6Enabled ? "::1" : "127.0.0.1";
             _logger.LogWarning("{Source}: GetBindInterface: Loopback {Result} returned.", source, result);
             _logger.LogWarning("{Source}: GetBindInterface: Loopback {Result} returned.", source, result);
             return result;
             return result;
         }
         }

+ 1 - 1
Jellyfin.Server/Program.cs

@@ -280,7 +280,7 @@ namespace Jellyfin.Server
                     bool flagged = false;
                     bool flagged = false;
                     foreach (IPObject netAdd in addresses)
                     foreach (IPObject netAdd in addresses)
                     {
                     {
-                        _logger.LogInformation("Kestrel listening on {0}", netAdd);
+                        _logger.LogInformation("Kestrel listening on {Address}", netAdd.Address == IPAddress.IPv6Any ? "All Addresses" : netAdd);
                         options.Listen(netAdd.Address, appHost.HttpPort);
                         options.Listen(netAdd.Address, appHost.HttpPort);
                         if (appHost.ListenWithHttps)
                         if (appHost.ListenWithHttps)
                         {
                         {