diff options
| author | Luke Pulverenti <luke.pulverenti@gmail.com> | 2016-12-07 15:02:34 -0500 |
|---|---|---|
| committer | Luke Pulverenti <luke.pulverenti@gmail.com> | 2016-12-07 15:02:34 -0500 |
| commit | 0130209cdce07dc042b075c6cf972a7eb1339861 (patch) | |
| tree | aede8b599fe887f206fbe703e023ed3677ea5f4f /SocketHttpListener.Portable | |
| parent | 20c249979759a836f63a886a871db69ceaeb757e (diff) | |
improve ipv6 error handling
Diffstat (limited to 'SocketHttpListener.Portable')
| -rw-r--r-- | SocketHttpListener.Portable/Net/EndPointListener.cs | 20 |
1 files changed, 18 insertions, 2 deletions
diff --git a/SocketHttpListener.Portable/Net/EndPointListener.cs b/SocketHttpListener.Portable/Net/EndPointListener.cs index 52385e2ba..690dedd09 100644 --- a/SocketHttpListener.Portable/Net/EndPointListener.cs +++ b/SocketHttpListener.Portable/Net/EndPointListener.cs @@ -26,7 +26,7 @@ namespace SocketHttpListener.Net Dictionary<HttpConnection, HttpConnection> unregistered; private readonly ILogger _logger; private bool _closed; - private readonly bool _enableDualMode; + private bool _enableDualMode; private readonly ICryptoProvider _cryptoProvider; private readonly IStreamFactory _streamFactory; private readonly ISocketFactory _socketFactory; @@ -65,7 +65,23 @@ namespace SocketHttpListener.Net private void CreateSocket() { - sock = _socketFactory.CreateSocket(endpoint.IpAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp, _enableDualMode); + try + { + sock = _socketFactory.CreateSocket(endpoint.IpAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp, _enableDualMode); + } + catch (SocketCreateException ex) + { + if (_enableDualMode && endpoint.IpAddress.Equals(IpAddressInfo.IPv6Any) && string.Equals(ex.ErrorCode, "AddressFamilyNotSupported", StringComparison.OrdinalIgnoreCase)) + { + endpoint = new IpEndPointInfo(IpAddressInfo.Any, endpoint.Port); + _enableDualMode = false; + sock = _socketFactory.CreateSocket(endpoint.IpAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp, _enableDualMode); + } + else + { + throw; + } + } sock.Bind(endpoint); |
