diff options
| author | Shadowghost <Ghost_of_Stone@web.de> | 2022-07-21 09:26:18 +0200 |
|---|---|---|
| committer | Shadowghost <Ghost_of_Stone@web.de> | 2022-07-21 09:26:18 +0200 |
| commit | f6e41269d94e4c3096b136a47d3616cb0c5fe316 (patch) | |
| tree | 294a1cf013d3c52422db6769dc80e1d39cc6bdf6 /RSSDP/SsdpCommunicationsServer.cs | |
| parent | 05458a4a4240d2b15db93de6c9ec25376677b5e1 (diff) | |
Enforce interface bindings on SSDP, add Loopback to LAN if no LAN defined
Diffstat (limited to 'RSSDP/SsdpCommunicationsServer.cs')
| -rw-r--r-- | RSSDP/SsdpCommunicationsServer.cs | 75 |
1 files changed, 52 insertions, 23 deletions
diff --git a/RSSDP/SsdpCommunicationsServer.cs b/RSSDP/SsdpCommunicationsServer.cs index 53f872b60..e6c0a4403 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 = ListenForBroadcastsAsync(); + } + 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,15 @@ namespace Rssdp.Infrastructure { lock (_BroadcastListenSocketSynchroniser) { - if (_BroadcastListenSocket != null) + if (_BroadcastListenSockets != null) { _logger.LogInformation("{0} disposing _BroadcastListenSocket", GetType().Name); - _BroadcastListenSocket.Dispose(); - _BroadcastListenSocket = null; + foreach (var socket in _BroadcastListenSockets) + { + socket.Dispose(); + } + + _BroadcastListenSockets = null; } } } @@ -336,12 +337,40 @@ namespace Rssdp.Infrastructure return Task.CompletedTask; } - private ISocket ListenForBroadcastsAsync() + private List<ISocket> ListenForBroadcastsAsync() { - 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 ListenForBroadcastsAsync. 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() |
