diff --git a/src/SuperSocket.Server.Abstractions/Connections/IConnectionListener.cs b/src/SuperSocket.Server.Abstractions/Connections/IConnectionListener.cs index 26da97f93..8be6d82c4 100644 --- a/src/SuperSocket.Server.Abstractions/Connections/IConnectionListener.cs +++ b/src/SuperSocket.Server.Abstractions/Connections/IConnectionListener.cs @@ -9,7 +9,7 @@ namespace SuperSocket.Server.Abstractions.Connections { public delegate ValueTask NewConnectionAcceptHandler(ListenOptions listenOptions, IConnection connection); - public interface IConnectionListener + public interface IConnectionListener : IDisposable { ListenOptions Options { get; } diff --git a/src/SuperSocket.Server/Connection/TcpConnectionListener.cs b/src/SuperSocket.Server/Connection/TcpConnectionListener.cs index 0907585ca..bab974f3d 100644 --- a/src/SuperSocket.Server/Connection/TcpConnectionListener.cs +++ b/src/SuperSocket.Server/Connection/TcpConnectionListener.cs @@ -131,7 +131,7 @@ public Task StopAsync() var listenSocket = _listenSocket; if (listenSocket == null) - return Task.Delay(0); + return Task.CompletedTask; _stopTaskCompletionSource = new TaskCompletionSource(); @@ -145,5 +145,15 @@ public override string ToString() { return Options?.ToString(); } + + public void Dispose() + { + var listenSocket = _listenSocket; + + if (listenSocket != null && Interlocked.CompareExchange(ref _listenSocket, null, listenSocket) == listenSocket) + { + listenSocket.Dispose(); + } + } } } \ No newline at end of file diff --git a/src/SuperSocket.Server/SuperSocketService.cs b/src/SuperSocket.Server/SuperSocketService.cs index 1012e80d9..9e8fda87e 100644 --- a/src/SuperSocket.Server/SuperSocketService.cs +++ b/src/SuperSocket.Server/SuperSocketService.cs @@ -555,6 +555,14 @@ protected virtual async ValueTask DisposeAsync(bool disposing) { _logger.LogError(e, "Failed to stop the server"); } + + if (_connectionListeners.Any()) + { + foreach (var listener in _connectionListeners) + { + listener.Dispose(); + } + } } disposedValue = true; diff --git a/src/SuperSocket.Udp/UdpConnectionListener.cs b/src/SuperSocket.Udp/UdpConnectionListener.cs index 90cd71f14..bdd5733d9 100644 --- a/src/SuperSocket.Udp/UdpConnectionListener.cs +++ b/src/SuperSocket.Udp/UdpConnectionListener.cs @@ -224,5 +224,15 @@ public override string ToString() { return Options?.ToString(); } + + public void Dispose() + { + var listenSocket = _listenSocket; + + if (listenSocket != null && Interlocked.CompareExchange(ref _listenSocket, null, listenSocket) == listenSocket) + { + listenSocket.Dispose(); + } + } } } \ No newline at end of file