diff --git a/Example3/Program.cs b/Example3/Program.cs index b06cebcf..5dd638be 100644 --- a/Example3/Program.cs +++ b/Example3/Program.cs @@ -72,6 +72,9 @@ namespace Example3 // Not to remove the inactive WebSocket sessions periodically. //httpsv.KeepClean = false; + // To resolve to wait for socket in TIME_WAIT state. + //httpsv.ReuseAddress = true; + // Add the WebSocket services. httpsv.AddWebSocketService ("/Echo"); httpsv.AddWebSocketService ("/Chat"); diff --git a/websocket-sharp/Net/EndPointListener.cs b/websocket-sharp/Net/EndPointListener.cs index 0c96bcc0..cd0d9830 100644 --- a/websocket-sharp/Net/EndPointListener.cs +++ b/websocket-sharp/Net/EndPointListener.cs @@ -83,7 +83,8 @@ namespace WebSocketSharp.Net int port, bool secure, string certificateFolderPath, - X509Certificate2 defaultCertificate) + X509Certificate2 defaultCertificate, + bool reuseAddress) { if (secure) { _secure = secure; @@ -92,13 +93,16 @@ namespace WebSocketSharp.Net throw new ArgumentException ("No server certificate could be found."); } - _endpoint = new IPEndPoint (address, port); _prefixes = new Dictionary (); _unregistered = new Dictionary (); _unregisteredSync = ((ICollection) _unregistered).SyncRoot; _socket = new Socket (address.AddressFamily, SocketType.Stream, ProtocolType.Tcp); + if (reuseAddress) + _socket.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); + + _endpoint = new IPEndPoint (address, port); _socket.Bind (_endpoint); _socket.Listen (500); diff --git a/websocket-sharp/Net/EndPointManager.cs b/websocket-sharp/Net/EndPointManager.cs index e24c7aa5..0fecb299 100644 --- a/websocket-sharp/Net/EndPointManager.cs +++ b/websocket-sharp/Net/EndPointManager.cs @@ -107,7 +107,8 @@ namespace WebSocketSharp.Net port, secure, httpListener.CertificateFolderPath, - httpListener.DefaultCertificate); + httpListener.DefaultCertificate, + httpListener.ReuseAddress); eps[port] = epl; } diff --git a/websocket-sharp/Net/HttpListener.cs b/websocket-sharp/Net/HttpListener.cs index aaa592ca..de253457 100644 --- a/websocket-sharp/Net/HttpListener.cs +++ b/websocket-sharp/Net/HttpListener.cs @@ -70,6 +70,7 @@ namespace WebSocketSharp.Net private bool _listening; private HttpListenerPrefixCollection _prefixes; private string _realm; + private bool _reuseAddress; private List _waitQueue; private object _waitQueueSync; @@ -109,6 +110,16 @@ namespace WebSocketSharp.Net } } + internal bool ReuseAddress { + get { + return _reuseAddress; + } + + set { + _reuseAddress = value; + } + } + #endregion #region Public Properties diff --git a/websocket-sharp/Server/HttpServer.cs b/websocket-sharp/Server/HttpServer.cs index e8f8b07e..35a54729 100644 --- a/websocket-sharp/Server/HttpServer.cs +++ b/websocket-sharp/Server/HttpServer.cs @@ -306,6 +306,34 @@ namespace WebSocketSharp.Server } } + /// + /// Gets or sets a value indicating whether the server is allowed to be bound to an address + /// that is already in use. + /// + /// + /// If you would like to resolve to wait for socket in TIME_WAIT state, you should set + /// this property to true. + /// + /// + /// true if the server is allowed to be bound to an address that is already in use; + /// otherwise, false. The default value is false. + /// + public bool ReuseAddress { + get { + return _listener.ReuseAddress; + } + + set { + var msg = _state.CheckIfStartable (); + if (msg != null) { + _logger.Error (msg); + return; + } + + _listener.ReuseAddress = value; + } + } + /// /// Gets or sets the document root path of the server. ///