aboutsummaryrefslogtreecommitdiff
path: root/RSSDP/SsdpCommunicationsServer.cs
diff options
context:
space:
mode:
authorShadowghost <Ghost_of_Stone@web.de>2022-07-21 09:26:18 +0200
committerShadowghost <Ghost_of_Stone@web.de>2022-07-21 09:26:18 +0200
commitf6e41269d94e4c3096b136a47d3616cb0c5fe316 (patch)
tree294a1cf013d3c52422db6769dc80e1d39cc6bdf6 /RSSDP/SsdpCommunicationsServer.cs
parent05458a4a4240d2b15db93de6c9ec25376677b5e1 (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.cs75
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()