aboutsummaryrefslogtreecommitdiff
path: root/RSSDP/SsdpCommunicationsServer.cs
diff options
context:
space:
mode:
Diffstat (limited to 'RSSDP/SsdpCommunicationsServer.cs')
-rw-r--r--RSSDP/SsdpCommunicationsServer.cs77
1 files changed, 52 insertions, 25 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)
{