|
|
|
@ -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()
|
|
|
|
|