aboutsummaryrefslogtreecommitdiff
path: root/SocketHttpListener.Portable
diff options
context:
space:
mode:
authorLuke Pulverenti <luke.pulverenti@gmail.com>2016-12-07 15:02:34 -0500
committerLuke Pulverenti <luke.pulverenti@gmail.com>2016-12-07 15:02:34 -0500
commit0130209cdce07dc042b075c6cf972a7eb1339861 (patch)
treeaede8b599fe887f206fbe703e023ed3677ea5f4f /SocketHttpListener.Portable
parent20c249979759a836f63a886a871db69ceaeb757e (diff)
improve ipv6 error handling
Diffstat (limited to 'SocketHttpListener.Portable')
-rw-r--r--SocketHttpListener.Portable/Net/EndPointListener.cs20
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);