diff options
Diffstat (limited to 'src/Jellyfin.Networking/AutoDiscoveryHost.cs')
| -rw-r--r-- | src/Jellyfin.Networking/AutoDiscoveryHost.cs | 69 |
1 files changed, 30 insertions, 39 deletions
diff --git a/src/Jellyfin.Networking/AutoDiscoveryHost.cs b/src/Jellyfin.Networking/AutoDiscoveryHost.cs index 5624c4ed1..ff0d179b9 100644 --- a/src/Jellyfin.Networking/AutoDiscoveryHost.cs +++ b/src/Jellyfin.Networking/AutoDiscoveryHost.cs @@ -1,6 +1,4 @@ using System; -using System.Collections.Generic; -using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; @@ -59,65 +57,58 @@ public sealed class AutoDiscoveryHost : BackgroundService return; } - var udpServers = new List<Task>(); - // Linux needs to bind to the broadcast addresses to receive broadcast traffic - if (OperatingSystem.IsLinux() && networkConfig.EnableIPv4) - { - udpServers.Add(ListenForAutoDiscoveryMessage(IPAddress.Broadcast, stoppingToken)); - } - - udpServers.AddRange(_networkManager.GetInternalBindAddresses() - .Select(intf => ListenForAutoDiscoveryMessage( - OperatingSystem.IsLinux() && intf.AddressFamily == AddressFamily.InterNetwork - ? NetworkUtils.GetBroadcastAddress(intf.Subnet) - : intf.Address, - stoppingToken))); - - await Task.WhenAll(udpServers).ConfigureAwait(false); + await ListenForAutoDiscoveryMessage(IPAddress.Any, stoppingToken).ConfigureAwait(false); } - private async Task ListenForAutoDiscoveryMessage(IPAddress address, CancellationToken cancellationToken) + private async Task ListenForAutoDiscoveryMessage(IPAddress listenAddress, 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(listenAddress, 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(result.RemoteEndPoint, udpClient, 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}", listenAddress, PortNumber); + } } - private async Task RespondToV2Message(UdpClient udpClient, IPEndPoint endpoint, CancellationToken cancellationToken) + private async Task RespondToV2Message(IPEndPoint endpoint, UdpClient broadCastUdpClient, CancellationToken cancellationToken) { var localUrl = _appHost.GetSmartApiUrl(endpoint.Address); if (string.IsNullOrEmpty(localUrl)) { - _logger.LogWarning("Unable to respond to server discovery request because the local ip address could not be determined."); + _logger.LogWarning("Unable to respond to server discovery request because the local ip address could not be determined"); return; } var response = new ServerDiscoveryInfo(localUrl, _appHost.SystemId, _appHost.FriendlyName); - try { _logger.LogDebug("Sending AutoDiscovery response"); - await udpClient + await broadCastUdpClient .SendAsync(JsonSerializer.SerializeToUtf8Bytes(response).AsMemory(), endpoint, cancellationToken) .ConfigureAwait(false); } |
