From b90a0a71e957022fd226bf4162af447777fc906e Mon Sep 17 00:00:00 2001 From: JKorf Date: Thu, 28 Mar 2024 20:35:49 +0100 Subject: [PATCH] Socket connection improvements on reconnect --- .../Sockets/CryptoExchangeWebSocketClient.cs | 14 +++++++++++--- CryptoExchange.Net/Sockets/SocketConnection.cs | 6 ++++++ 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/CryptoExchange.Net/Sockets/CryptoExchangeWebSocketClient.cs b/CryptoExchange.Net/Sockets/CryptoExchangeWebSocketClient.cs index e6876a8..b8734a7 100644 --- a/CryptoExchange.Net/Sockets/CryptoExchangeWebSocketClient.cs +++ b/CryptoExchange.Net/Sockets/CryptoExchangeWebSocketClient.cs @@ -194,11 +194,16 @@ namespace CryptoExchange.Net.Sockets try { using CancellationTokenSource tcs = new(TimeSpan.FromSeconds(10)); - await _socket.ConnectAsync(Uri, tcs.Token).ConfigureAwait(false); + using var linked = CancellationTokenSource.CreateLinkedTokenSource(tcs.Token, _ctsSource.Token); + await _socket.ConnectAsync(Uri, linked.Token).ConfigureAwait(false); } catch (Exception e) { - _logger.SocketConnectionFailed(Id, e.Message, e); + if (!_ctsSource.IsCancellationRequested) + { + // if _ctsSource was canceled this was already logged + _logger.SocketConnectionFailed(Id, e.Message, e); + } return false; } @@ -386,10 +391,13 @@ namespace CryptoExchange.Net.Sockets if (_disposed) return; + if (_ctsSource?.IsCancellationRequested == false) + _ctsSource.Cancel(); + _logger.SocketDisposing(Id); _disposed = true; _socket.Dispose(); - _ctsSource.Dispose(); + _ctsSource?.Dispose(); _logger.SocketDisposed(Id); } diff --git a/CryptoExchange.Net/Sockets/SocketConnection.cs b/CryptoExchange.Net/Sockets/SocketConnection.cs index 137cc80..637b503 100644 --- a/CryptoExchange.Net/Sockets/SocketConnection.cs +++ b/CryptoExchange.Net/Sockets/SocketConnection.cs @@ -714,6 +714,12 @@ namespace CryptoExchange.Net.Sockets return new CallResult(new InvalidOperationError(info)); } + if (!_socket.IsOpen) + { + _logger.LogWarning("[Sckt {SocketId}] msg {RequestId} - Failed to send, socket no longer open", SocketId, requestId); + return new CallResult(new WebError("Failed to send message, socket no longer open")); + } + _logger.SendingData(SocketId, requestId, data); try {