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