From 7020b5cb1491daa49ca22acc32d12d212df7a709 Mon Sep 17 00:00:00 2001
From: JKorf <jankorf91@gmail.com>
Date: Thu, 17 Jan 2019 14:52:28 +0100
Subject: [PATCH] Fix for reconnecting

---
 CryptoExchange.Net/CryptoExchange.Net.csproj |  2 +-
 CryptoExchange.Net/SocketClient.cs           | 50 ++++++++++++--------
 2 files changed, 30 insertions(+), 22 deletions(-)

diff --git a/CryptoExchange.Net/CryptoExchange.Net.csproj b/CryptoExchange.Net/CryptoExchange.Net.csproj
index 02077bd..3ece18e 100644
--- a/CryptoExchange.Net/CryptoExchange.Net.csproj
+++ b/CryptoExchange.Net/CryptoExchange.Net.csproj
@@ -7,7 +7,7 @@
   <PropertyGroup>
     <PackageId>CryptoExchange.Net</PackageId>
 	<Authors>JKorf</Authors>
-    <PackageVersion>2.0.7</PackageVersion>
+    <PackageVersion>2.0.8</PackageVersion>
 	<PackageRequireLicenseAcceptance>false</PackageRequireLicenseAcceptance>
     <PackageProjectUrl>https://github.com/JKorf/CryptoExchange.Net</PackageProjectUrl>
 	<PackageLicenseUrl>https://github.com/JKorf/CryptoExchange.Net/blob/master/LICENSE</PackageLicenseUrl>
diff --git a/CryptoExchange.Net/SocketClient.cs b/CryptoExchange.Net/SocketClient.cs
index e3e379e..642328e 100644
--- a/CryptoExchange.Net/SocketClient.cs
+++ b/CryptoExchange.Net/SocketClient.cs
@@ -174,33 +174,41 @@ namespace CryptoExchange.Net
 
                 socket.Reconnecting = true;
 
-                log.Write(LogVerbosity.Info, $"Socket {socket.Id} Connection lost, will try to reconnect");
+                log.Write(LogVerbosity.Info, $"Socket {socket.Id} Connection lost, will try to reconnect after {ReconnectInterval}");
                 Task.Run(() =>
                 {
-                    Thread.Sleep(ReconnectInterval);
-                    socket.Reset();
-
-                    if (!socket.Connect().Result)
+                    while (socket.ShouldReconnect)
                     {
-                        log.Write(LogVerbosity.Debug, $"Socket {socket.Id} failed to reconnect");
-                        return; // Connect() should result in a SocketClosed event so we end up here again
+                        Thread.Sleep(ReconnectInterval);
+                        socket.Reset();
+                        if (!socket.Connect().Result)
+                        {
+                            log.Write(LogVerbosity.Debug, $"Socket {socket.Id} failed to reconnect");
+                            continue; 
+                        }
+
+                        var time = socket.DisconnectTime;
+                        socket.DisconnectTime = null;
+
+                        log.Write(LogVerbosity.Info, $"Socket {socket.Id} reconnected after {DateTime.UtcNow - time}");
+
+                        SocketSubscription subscription;
+                        lock (sockets)
+                            subscription = sockets.Single(s => s.Socket == socket);
+
+                        if (!SocketReconnect(subscription, DateTime.UtcNow - time.Value))
+                        {
+                            log.Write(LogVerbosity.Info, $"Socket {socket.Id} failed to resubscribe resubscribed");
+                            socket.Close().Wait();
+                        }
+                        else
+                        {
+                            log.Write(LogVerbosity.Info, $"Socket {socket.Id} successfully resubscribed");
+                            break;
+                        }
                     }
-                    var time = socket.DisconnectTime;
-                    socket.DisconnectTime = null;
-                    if (time == null)
-                        return;
-
-                    log.Write(LogVerbosity.Info, $"Socket {socket.Id} reconnected after {DateTime.UtcNow - time}");
-
-                    SocketSubscription subscription;
-                    lock (sockets)
-                        subscription = sockets.Single(s => s.Socket == socket);
 
                     socket.Reconnecting = false;
-                    if (!SocketReconnect(subscription, DateTime.UtcNow - time.Value))
-                        socket.Close().Wait(); // Close so we end up reconnecting again
-                    else
-                        log.Write(LogVerbosity.Info, $"Socket {socket.Id} successfully resubscribed");
                 });
             }
             else