diff options
Diffstat (limited to 'Emby.Common.Implementations/Net/SocketFactory.cs')
| -rw-r--r-- | Emby.Common.Implementations/Net/SocketFactory.cs | 33 |
1 files changed, 25 insertions, 8 deletions
diff --git a/Emby.Common.Implementations/Net/SocketFactory.cs b/Emby.Common.Implementations/Net/SocketFactory.cs index 124252097..79310e017 100644 --- a/Emby.Common.Implementations/Net/SocketFactory.cs +++ b/Emby.Common.Implementations/Net/SocketFactory.cs @@ -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) { - var addressFamily = family == IpAddressFamily.InterNetwork - ? AddressFamily.InterNetwork - : AddressFamily.InterNetworkV6; + try + { + var addressFamily = family == IpAddressFamily.InterNetwork + ? AddressFamily.InterNetwork + : AddressFamily.InterNetworkV6; - var socket = new Socket(addressFamily, System.Net.Sockets.SocketType.Stream, System.Net.Sockets.ProtocolType.Tcp); + var socket = new Socket(addressFamily, System.Net.Sockets.SocketType.Stream, System.Net.Sockets.ProtocolType.Tcp); - if (dualMode) - { - socket.DualMode = true; + 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); + } + } - return new NetSocket(socket, _logger); + throw; + } } #region ISocketFactory Members |
