diff options
Diffstat (limited to 'RSSDP')
| -rw-r--r-- | RSSDP/SsdpCommunicationsServer.cs | 77 | ||||
| -rw-r--r-- | RSSDP/SsdpDevicePublisher.cs | 5 |
2 files changed, 54 insertions, 28 deletions
diff --git a/RSSDP/SsdpCommunicationsServer.cs b/RSSDP/SsdpCommunicationsServer.cs index 6e4f5634d..da357546d 100644 --- a/RSSDP/SsdpCommunicationsServer.cs +++ b/RSSDP/SsdpCommunicationsServer.cs @@ -33,7 +33,7 @@ namespace Rssdp.Infrastructure */ private object _BroadcastListenSocketSynchroniser = new object(); - private ISocket _BroadcastListenSocket; + private List<ISocket> _BroadcastListenSockets; private object _SendSocketSynchroniser = new object(); private List<ISocket> _sendSockets; @@ -111,24 +111,21 @@ namespace Rssdp.Infrastructure { ThrowIfDisposed(); - if (_BroadcastListenSocket == null) + lock (_BroadcastListenSocketSynchroniser) { - lock (_BroadcastListenSocketSynchroniser) + if (_BroadcastListenSockets == null) { - if (_BroadcastListenSocket == null) + try + { + _BroadcastListenSockets = ListenForBroadcasts(); + } + catch (SocketException ex) + { + _logger.LogError("Failed to bind to port 1900: {Message}. DLNA will be unavailable", ex.Message); + } + catch (Exception ex) { - try - { - _BroadcastListenSocket = ListenForBroadcastsAsync(); - } - catch (SocketException ex) - { - _logger.LogError("Failed to bind to port 1900: {Message}. DLNA will be unavailable", ex.Message); - } - catch (Exception ex) - { - _logger.LogError(ex, "Error in BeginListeningForBroadcasts"); - } + _logger.LogError(ex, "Error in BeginListeningForBroadcasts"); } } } @@ -142,11 +139,11 @@ namespace Rssdp.Infrastructure { lock (_BroadcastListenSocketSynchroniser) { - if (_BroadcastListenSocket != null) + if (_BroadcastListenSockets != null) { _logger.LogInformation("{0} disposing _BroadcastListenSocket", GetType().Name); - _BroadcastListenSocket.Dispose(); - _BroadcastListenSocket = null; + _BroadcastListenSockets.ForEach(s => s.Dispose()); + _BroadcastListenSockets = null; } } } @@ -336,20 +333,46 @@ namespace Rssdp.Infrastructure return Task.CompletedTask; } - private ISocket ListenForBroadcastsAsync() + private List<ISocket> ListenForBroadcasts() { - var socket = _SocketFactory.CreateUdpMulticastSocket(IPAddress.Parse(SsdpConstants.MulticastLocalAdminAddress), _MulticastTtl, SsdpConstants.MulticastPort); - _ = ListenToSocketInternal(socket); + var sockets = new List<ISocket>(); + if (_enableMultiSocketBinding) + { + foreach (var address in _networkManager.GetInternalBindAddresses()) + { + if (address.AddressFamily == AddressFamily.InterNetworkV6) + { + // Not support IPv6 right now + continue; + } - return socket; + try + { + sockets.Add(_SocketFactory.CreateUdpMulticastSocket(IPAddress.Parse(SsdpConstants.MulticastLocalAdminAddress), address.Address, _MulticastTtl, SsdpConstants.MulticastPort)); + } + catch (Exception ex) + { + _logger.LogError(ex, "Error in ListenForBroadcasts. IPAddress: {0}", address); + } + } + } + else + { + sockets.Add(_SocketFactory.CreateUdpMulticastSocket(IPAddress.Parse(SsdpConstants.MulticastLocalAdminAddress), IPAddress.Any, _MulticastTtl, SsdpConstants.MulticastPort)); + } + + foreach (var socket in sockets) + { + _ = ListenToSocketInternal(socket); + } + + return sockets; } private List<ISocket> CreateSocketAndListenForResponsesAsync() { var sockets = new List<ISocket>(); - sockets.Add(_SocketFactory.CreateSsdpUdpSocket(IPAddress.Any, _LocalPort)); - if (_enableMultiSocketBinding) { foreach (var address in _networkManager.GetInternalBindAddresses()) @@ -370,6 +393,10 @@ namespace Rssdp.Infrastructure } } } + else + { + sockets.Add(_SocketFactory.CreateSsdpUdpSocket(IPAddress.Any, _LocalPort)); + } foreach (var socket in sockets) { diff --git a/RSSDP/SsdpDevicePublisher.cs b/RSSDP/SsdpDevicePublisher.cs index a7767b3c0..adaac5fa3 100644 --- a/RSSDP/SsdpDevicePublisher.cs +++ b/RSSDP/SsdpDevicePublisher.cs @@ -7,6 +7,7 @@ using System.Net; using System.Threading; using System.Threading.Tasks; using MediaBrowser.Common.Net; +using Microsoft.AspNetCore.HttpOverrides; namespace Rssdp.Infrastructure { @@ -297,9 +298,7 @@ namespace Rssdp.Infrastructure foreach (var device in deviceList) { var root = device.ToRootDevice(); - var source = new IPNetAddress(root.Address, root.PrefixLength); - var destination = new IPNetAddress(remoteEndPoint.Address, root.PrefixLength); - if (!_sendOnlyMatchedHost || source.NetworkAddress.Equals(destination.NetworkAddress)) + if (!_sendOnlyMatchedHost || root.Address.Equals(remoteEndPoint.Address)) { SendDeviceSearchResponses(device, remoteEndPoint, receivedOnlocalIpAddress, cancellationToken); } |
