From eb0f9c9529683b217fac534f99d5b04c628016c7 Mon Sep 17 00:00:00 2001 From: Michael Adelson Date: Sat, 3 Dec 2022 10:07:14 -0500 Subject: [PATCH] attempt to fix connection loss issue (cherry picked from commit 4f6118ee5b51385f7fedd5a2ca7f2367e8077b2d) --- .../src/ZooKeeperNetEx/utils/SocketContext.cs | 23 ++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/csharp/src/ZooKeeperNetEx/utils/SocketContext.cs b/src/csharp/src/ZooKeeperNetEx/utils/SocketContext.cs index 1158f946159..9085ea48218 100644 --- a/src/csharp/src/ZooKeeperNetEx/utils/SocketContext.cs +++ b/src/csharp/src/ZooKeeperNetEx/utils/SocketContext.cs @@ -74,7 +74,9 @@ public SocketAsyncOperation GetResult() var socketAsyncEventArgs = _socketAsyncEventArgs; - if (socketAsyncEventArgs.LastOperation == SocketAsyncOperation.Receive && _socket.Available == 0) + if (socketAsyncEventArgs.LastOperation == SocketAsyncOperation.Receive + && _socket.Available == 0 + && !IsSocketConnected()) { socketAsyncEventArgs.SocketError = SocketError.ConnectionReset; } @@ -85,6 +87,25 @@ public SocketAsyncOperation GetResult() } return socketAsyncEventArgs.LastOperation; } + + private bool IsSocketConnected() + { + // based on https://learn.microsoft.com/en-us/dotnet/api/system.net.sockets.socket.connected + + var originalBlockingState = _socket.Blocking; + try + { + _socket.Blocking = false; + _socket.Send(new byte[1], size: 0, SocketFlags.None); + } + catch (SocketException) { } + finally + { + _socket.Blocking = originalBlockingState; + } + + return _socket.Connected; + } private void ThrowIfDisposed() {