소스 검색

Update EAP implementation to correctly deal with a socket operation that is completed synchronously.

Fixes #571.
drieseng 5 년 전
부모
커밋
916c019266
1개의 변경된 파일20개의 추가작업 그리고 8개의 파일을 삭제
  1. 20 8
      src/Renci.SshNet/Abstractions/SocketAbstraction.cs

+ 20 - 8
src/Renci.SshNet/Abstractions/SocketAbstraction.cs

@@ -148,10 +148,10 @@ namespace Renci.SshNet.Abstractions
             var receiveCompleted = new ManualResetEvent(false);
             var sendReceiveToken = new PartialSendReceiveToken(socket, receiveCompleted);
             var args = new SocketAsyncEventArgs
-            {
-                RemoteEndPoint = socket.RemoteEndPoint,
-                UserToken = sendReceiveToken
-            };
+                {
+                    RemoteEndPoint = socket.RemoteEndPoint,
+                    UserToken = sendReceiveToken
+                };
             args.Completed += ReceiveCompleted;
             args.SetBuffer(buffer, offset, size);
 
@@ -166,6 +166,10 @@ namespace Renci.SshNet.Abstractions
                                 "Socket read operation has timed out after {0:F0} milliseconds.",
                                 timeout.TotalMilliseconds));
                 }
+                else
+                {
+                    sendReceiveToken.Process(args);
+                }
 
                 if (args.SocketError != SocketError.Success)
                     throw new SocketException((int) args.SocketError);
@@ -359,10 +363,10 @@ namespace Renci.SshNet.Abstractions
             var sendReceiveToken = new BlockingSendReceiveToken(socket, buffer, offset, size, receiveCompleted);
 
             var args = new SocketAsyncEventArgs
-            {
-                UserToken = sendReceiveToken,
-                RemoteEndPoint = socket.RemoteEndPoint
-            };
+                {
+                    UserToken = sendReceiveToken,
+                    RemoteEndPoint = socket.RemoteEndPoint
+                };
             args.Completed += ReceiveCompleted;
             args.SetBuffer(buffer, offset, size);
 
@@ -374,6 +378,10 @@ namespace Renci.SshNet.Abstractions
                         throw new SshOperationTimeoutException(string.Format(CultureInfo.InvariantCulture,
                             "Socket read operation has timed out after {0:F0} milliseconds.", timeout.TotalMilliseconds));
                 }
+                else
+                {
+                    sendReceiveToken.Process(args);
+                }
 
                 if (args.SocketError != SocketError.Success)
                         throw new SocketException((int) args.SocketError);
@@ -443,6 +451,10 @@ namespace Renci.SshNet.Abstractions
                     if (!sendCompleted.WaitOne())
                         throw new SocketException((int) SocketError.TimedOut);
                 }
+                else
+                {
+                    sendReceiveToken.Process(socketAsyncSendArgs);
+                }
 
                 if (socketAsyncSendArgs.SocketError != SocketError.Success)
                     throw new SocketException((int) socketAsyncSendArgs.SocketError);