Merge pull request #2330 from MediaBrowser/dev

update recording fields
This commit is contained in:
Luke 2016-12-05 13:47:07 -05:00 committed by GitHub
commit d0af746823
3 changed files with 56 additions and 26 deletions

View file

@ -33,18 +33,35 @@ namespace Emby.Common.Implementations.Net
public ISocket CreateSocket(IpAddressFamily family, MediaBrowser.Model.Net.SocketType socketType, MediaBrowser.Model.Net.ProtocolType protocolType, bool dualMode) public ISocket CreateSocket(IpAddressFamily family, MediaBrowser.Model.Net.SocketType socketType, MediaBrowser.Model.Net.ProtocolType protocolType, bool dualMode)
{ {
var addressFamily = family == IpAddressFamily.InterNetwork try
? AddressFamily.InterNetwork
: AddressFamily.InterNetworkV6;
var socket = new Socket(addressFamily, System.Net.Sockets.SocketType.Stream, System.Net.Sockets.ProtocolType.Tcp);
if (dualMode)
{ {
socket.DualMode = true; var addressFamily = family == IpAddressFamily.InterNetwork
} ? AddressFamily.InterNetwork
: AddressFamily.InterNetworkV6;
return new NetSocket(socket, _logger); var socket = new Socket(addressFamily, System.Net.Sockets.SocketType.Stream, System.Net.Sockets.ProtocolType.Tcp);
if (dualMode)
{
socket.DualMode = true;
}
return new NetSocket(socket, _logger);
}
catch (SocketException ex)
{
if (dualMode)
{
_logger.Error("Error creating dual mode socket: {0}. Will retry with ipv4-only.", ex.SocketErrorCode);
if (ex.SocketErrorCode == SocketError.AddressFamilyNotSupported)
{
return CreateSocket(IpAddressFamily.InterNetwork, socketType, protocolType, false);
}
}
throw;
}
} }
#region ISocketFactory Members #region ISocketFactory Members

View file

@ -158,7 +158,9 @@ namespace Emby.Dlna.Main
{ {
if (_communicationsServer == null) if (_communicationsServer == null)
{ {
_communicationsServer = new SsdpCommunicationsServer(_socketFactory, _networkManager, _logger) var enableMultiSocketBinding = _environmentInfo.OperatingSystem == OperatingSystem.Windows;
_communicationsServer = new SsdpCommunicationsServer(_socketFactory, _networkManager, _logger, enableMultiSocketBinding)
{ {
IsShared = true IsShared = true
}; };

View file

@ -52,6 +52,7 @@ namespace Rssdp.Infrastructure
private int _MulticastTtl; private int _MulticastTtl;
private bool _IsShared; private bool _IsShared;
private readonly bool _enableMultiSocketBinding;
#endregion #endregion
@ -75,8 +76,8 @@ namespace Rssdp.Infrastructure
/// Minimum constructor. /// Minimum constructor.
/// </summary> /// </summary>
/// <exception cref="System.ArgumentNullException">The <paramref name="socketFactory"/> argument is null.</exception> /// <exception cref="System.ArgumentNullException">The <paramref name="socketFactory"/> argument is null.</exception>
public SsdpCommunicationsServer(ISocketFactory socketFactory, INetworkManager networkManager, ILogger logger) public SsdpCommunicationsServer(ISocketFactory socketFactory, INetworkManager networkManager, ILogger logger, bool enableMultiSocketBinding)
: this(socketFactory, 0, SsdpConstants.SsdpDefaultMulticastTimeToLive, networkManager, logger) : this(socketFactory, 0, SsdpConstants.SsdpDefaultMulticastTimeToLive, networkManager, logger, enableMultiSocketBinding)
{ {
} }
@ -85,7 +86,7 @@ namespace Rssdp.Infrastructure
/// </summary> /// </summary>
/// <exception cref="System.ArgumentNullException">The <paramref name="socketFactory"/> argument is null.</exception> /// <exception cref="System.ArgumentNullException">The <paramref name="socketFactory"/> argument is null.</exception>
/// <exception cref="System.ArgumentOutOfRangeException">The <paramref name="multicastTimeToLive"/> argument is less than or equal to zero.</exception> /// <exception cref="System.ArgumentOutOfRangeException">The <paramref name="multicastTimeToLive"/> argument is less than or equal to zero.</exception>
public SsdpCommunicationsServer(ISocketFactory socketFactory, int localPort, int multicastTimeToLive, INetworkManager networkManager, ILogger logger) public SsdpCommunicationsServer(ISocketFactory socketFactory, int localPort, int multicastTimeToLive, INetworkManager networkManager, ILogger logger, bool enableMultiSocketBinding)
{ {
if (socketFactory == null) throw new ArgumentNullException("socketFactory"); if (socketFactory == null) throw new ArgumentNullException("socketFactory");
if (multicastTimeToLive <= 0) throw new ArgumentOutOfRangeException("multicastTimeToLive", "multicastTimeToLive must be greater than zero."); if (multicastTimeToLive <= 0) throw new ArgumentOutOfRangeException("multicastTimeToLive", "multicastTimeToLive must be greater than zero.");
@ -102,6 +103,7 @@ namespace Rssdp.Infrastructure
_MulticastTtl = multicastTimeToLive; _MulticastTtl = multicastTimeToLive;
_networkManager = networkManager; _networkManager = networkManager;
_logger = logger; _logger = logger;
_enableMultiSocketBinding = enableMultiSocketBinding;
} }
#endregion #endregion
@ -199,16 +201,22 @@ namespace Rssdp.Infrastructure
if (fromLocalIpAddress.AddressFamily == IpAddressFamily.InterNetwork) if (fromLocalIpAddress.AddressFamily == IpAddressFamily.InterNetwork)
{ {
sockets = sockets.Where(i => i.LocalIPAddress.Equals(IpAddressInfo.Any) || fromLocalIpAddress.Equals(i.LocalIPAddress)); sockets = sockets.Where(i => i.LocalIPAddress.Equals(IpAddressInfo.Any) || fromLocalIpAddress.Equals(i.LocalIPAddress));
// If sending to the loopback address, filter the socket list as well
if (destination.IpAddress.Equals(IpAddressInfo.Loopback))
{
sockets = sockets.Where(i => i.LocalIPAddress.Equals(IpAddressInfo.Any) || i.LocalIPAddress.Equals(IpAddressInfo.Loopback));
}
} }
else if (fromLocalIpAddress.AddressFamily == IpAddressFamily.InterNetworkV6) else if (fromLocalIpAddress.AddressFamily == IpAddressFamily.InterNetworkV6)
{ {
sockets = sockets.Where(i => i.LocalIPAddress.Equals(IpAddressInfo.IPv6Any) || fromLocalIpAddress.Equals(i.LocalIPAddress)); sockets = sockets.Where(i => i.LocalIPAddress.Equals(IpAddressInfo.IPv6Any) || fromLocalIpAddress.Equals(i.LocalIPAddress));
}
// If sending to the loopback address, filter the socket list as well // If sending to the loopback address, filter the socket list as well
if (destination.IpAddress.Equals(IpAddressInfo.Loopback)) if (destination.IpAddress.Equals(IpAddressInfo.IPv6Loopback))
{ {
sockets = sockets.Where(i => i.LocalIPAddress.Equals(IpAddressInfo.Any) || i.LocalIPAddress.Equals(IpAddressInfo.Loopback)); sockets = sockets.Where(i => i.LocalIPAddress.Equals(IpAddressInfo.IPv6Any) || i.LocalIPAddress.Equals(IpAddressInfo.IPv6Loopback));
}
} }
return sockets.ToList(); return sockets.ToList();
@ -353,15 +361,18 @@ namespace Rssdp.Infrastructure
sockets.Add(_SocketFactory.CreateSsdpUdpSocket(IpAddressInfo.Any, _LocalPort)); sockets.Add(_SocketFactory.CreateSsdpUdpSocket(IpAddressInfo.Any, _LocalPort));
foreach (var address in _networkManager.GetLocalIpAddresses().ToList()) if (_enableMultiSocketBinding)
{ {
try foreach (var address in _networkManager.GetLocalIpAddresses().ToList())
{ {
sockets.Add(_SocketFactory.CreateSsdpUdpSocket(address, _LocalPort)); try
} {
catch (Exception ex) sockets.Add(_SocketFactory.CreateSsdpUdpSocket(address, _LocalPort));
{ }
_logger.ErrorException("Error in CreateSsdpUdpSocket. IPAddress: {0}", ex, address); catch (Exception ex)
{
_logger.ErrorException("Error in CreateSsdpUdpSocket. IPAddress: {0}", ex, address);
}
} }
} }