Browse Source

Catch exceptions in auto discovery (#11252)

Cody Robibero 1 year ago
parent
commit
ed82d79647
1 changed files with 25 additions and 17 deletions
  1. 25 17
      src/Jellyfin.Networking/AutoDiscoveryHost.cs

+ 25 - 17
src/Jellyfin.Networking/AutoDiscoveryHost.cs

@@ -78,28 +78,36 @@ public sealed class AutoDiscoveryHost : BackgroundService
 
 
     private async Task ListenForAutoDiscoveryMessage(IPAddress address, CancellationToken cancellationToken)
     private async Task ListenForAutoDiscoveryMessage(IPAddress address, CancellationToken cancellationToken)
     {
     {
-        using var udpClient = new UdpClient(new IPEndPoint(address, PortNumber));
-        udpClient.MulticastLoopback = false;
-
-        while (!cancellationToken.IsCancellationRequested)
+        try
         {
         {
-            try
+            using var udpClient = new UdpClient(new IPEndPoint(address, PortNumber));
+            udpClient.MulticastLoopback = false;
+
+            while (!cancellationToken.IsCancellationRequested)
             {
             {
-                var result = await udpClient.ReceiveAsync(cancellationToken).ConfigureAwait(false);
-                var text = Encoding.UTF8.GetString(result.Buffer);
-                if (text.Contains("who is JellyfinServer?", StringComparison.OrdinalIgnoreCase))
+                try
                 {
                 {
-                    await RespondToV2Message(udpClient, result.RemoteEndPoint, cancellationToken).ConfigureAwait(false);
+                    var result = await udpClient.ReceiveAsync(cancellationToken).ConfigureAwait(false);
+                    var text = Encoding.UTF8.GetString(result.Buffer);
+                    if (text.Contains("who is JellyfinServer?", StringComparison.OrdinalIgnoreCase))
+                    {
+                        await RespondToV2Message(udpClient, result.RemoteEndPoint, cancellationToken).ConfigureAwait(false);
+                    }
+                }
+                catch (SocketException ex)
+                {
+                    _logger.LogError(ex, "Failed to receive data from socket");
                 }
                 }
             }
             }
-            catch (SocketException ex)
-            {
-                _logger.LogError(ex, "Failed to receive data from socket");
-            }
-            catch (OperationCanceledException)
-            {
-                _logger.LogDebug("Broadcast socket operation cancelled");
-            }
+        }
+        catch (OperationCanceledException)
+        {
+            _logger.LogDebug("Broadcast socket operation cancelled");
+        }
+        catch (Exception ex)
+        {
+            // Exception in this function will prevent the background service from restarting in-process.
+            _logger.LogError(ex, "Unable to bind to {Address}:{Port}", address, PortNumber);
         }
         }
     }
     }