mirror of
https://github.com/jellyfin/jellyfin.git
synced 2026-06-03 22:38:30 +01:00
Send DLNA devices message to only the matched interface
This will be the right way for multiple interfaces, or the client will receive all devices message with different IP addresses and could not detect which one could access. And provide one option DlnaOptions.SendOnlyMatchedHost to fallback to old behaviour if this commit missed something.
This commit is contained in:
@@ -7,6 +7,7 @@ using System.Text;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using MediaBrowser.Model.Net;
|
||||
using MediaBrowser.Common.Net;
|
||||
using Rssdp;
|
||||
|
||||
namespace Rssdp.Infrastructure
|
||||
@@ -16,10 +17,12 @@ namespace Rssdp.Infrastructure
|
||||
/// </summary>
|
||||
public class SsdpDevicePublisher : DisposableManagedObjectBase, ISsdpDevicePublisher
|
||||
{
|
||||
private readonly INetworkManager _networkManager;
|
||||
|
||||
private ISsdpCommunicationsServer _CommsServer;
|
||||
private string _OSName;
|
||||
private string _OSVersion;
|
||||
private bool _sendOnlyMatchedHost;
|
||||
|
||||
private bool _SupportPnpRootDevice;
|
||||
|
||||
@@ -37,9 +40,11 @@ namespace Rssdp.Infrastructure
|
||||
/// <summary>
|
||||
/// Default constructor.
|
||||
/// </summary>
|
||||
public SsdpDevicePublisher(ISsdpCommunicationsServer communicationsServer, string osName, string osVersion)
|
||||
public SsdpDevicePublisher(ISsdpCommunicationsServer communicationsServer, INetworkManager networkManager,
|
||||
string osName, string osVersion, bool sendOnlyMatchedHost)
|
||||
{
|
||||
if (communicationsServer == null) throw new ArgumentNullException(nameof(communicationsServer));
|
||||
if (networkManager == null) throw new ArgumentNullException(nameof(networkManager));
|
||||
if (osName == null) throw new ArgumentNullException(nameof(osName));
|
||||
if (osName.Length == 0) throw new ArgumentException("osName cannot be an empty string.", nameof(osName));
|
||||
if (osVersion == null) throw new ArgumentNullException(nameof(osVersion));
|
||||
@@ -51,10 +56,12 @@ namespace Rssdp.Infrastructure
|
||||
_RecentSearchRequests = new Dictionary<string, SearchRequest>(StringComparer.OrdinalIgnoreCase);
|
||||
_Random = new Random();
|
||||
|
||||
_networkManager = networkManager;
|
||||
_CommsServer = communicationsServer;
|
||||
_CommsServer.RequestReceived += CommsServer_RequestReceived;
|
||||
_OSName = osName;
|
||||
_OSVersion = osVersion;
|
||||
_sendOnlyMatchedHost = sendOnlyMatchedHost;
|
||||
|
||||
_CommsServer.BeginListeningForBroadcasts();
|
||||
}
|
||||
@@ -250,7 +257,11 @@ namespace Rssdp.Infrastructure
|
||||
|
||||
foreach (var device in deviceList)
|
||||
{
|
||||
SendDeviceSearchResponses(device, remoteEndPoint, receivedOnlocalIpAddress, cancellationToken);
|
||||
if (!_sendOnlyMatchedHost ||
|
||||
_networkManager.IsInSameSubnet(device.ToRootDevice().Address, remoteEndPoint.IpAddress, device.ToRootDevice().SubnetMask))
|
||||
{
|
||||
SendDeviceSearchResponses(device, remoteEndPoint, receivedOnlocalIpAddress, cancellationToken);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -427,7 +438,12 @@ namespace Rssdp.Infrastructure
|
||||
|
||||
var message = BuildMessage(header, values);
|
||||
|
||||
_CommsServer.SendMulticastMessage(message, cancellationToken);
|
||||
if (_sendOnlyMatchedHost)
|
||||
{
|
||||
_CommsServer.SendMulticastMessage(message, _sendOnlyMatchedHost ? rootDevice.Address : null, cancellationToken);
|
||||
} else {
|
||||
_CommsServer.SendMulticastMessage(message, null, cancellationToken);
|
||||
}
|
||||
|
||||
//WriteTrace(String.Format("Sent alive notification"), device);
|
||||
}
|
||||
@@ -472,7 +488,13 @@ namespace Rssdp.Infrastructure
|
||||
|
||||
var sendCount = IsDisposed ? 1 : 3;
|
||||
WriteTrace(String.Format("Sent byebye notification"), device);
|
||||
return _CommsServer.SendMulticastMessage(message, sendCount, cancellationToken);
|
||||
if (_sendOnlyMatchedHost)
|
||||
{
|
||||
return _CommsServer.SendMulticastMessage(message, sendCount,
|
||||
_sendOnlyMatchedHost ? device.ToRootDevice().Address : null, cancellationToken);
|
||||
} else {
|
||||
return _CommsServer.SendMulticastMessage(message, sendCount, null, cancellationToken);
|
||||
}
|
||||
}
|
||||
|
||||
private void DisposeRebroadcastTimer()
|
||||
|
||||
Reference in New Issue
Block a user