|
|
@@ -100,7 +100,19 @@ namespace Renci.SshNet.Abstractions
|
|
|
public static int ReadPartial(Socket socket, byte[] buffer, int offset, int size, TimeSpan timeout)
|
|
|
{
|
|
|
#if FEATURE_SOCKET_SYNC
|
|
|
- return socket.Receive(buffer, offset, size, SocketFlags.None);
|
|
|
+ socket.ReceiveTimeout = (int) timeout.TotalMilliseconds;
|
|
|
+
|
|
|
+ try
|
|
|
+ {
|
|
|
+ return socket.Receive(buffer, offset, size, SocketFlags.None);
|
|
|
+ }
|
|
|
+ catch (SocketException ex)
|
|
|
+ {
|
|
|
+ if (ex.SocketErrorCode == SocketError.TimedOut)
|
|
|
+ throw new SshOperationTimeoutException(string.Format(CultureInfo.InvariantCulture,
|
|
|
+ "Socket read operation has timed out after {0:F0} milliseconds.", timeout.TotalMilliseconds));
|
|
|
+ throw;
|
|
|
+ }
|
|
|
#elif FEATURE_SOCKET_EAP
|
|
|
var receiveCompleted = new ManualResetEvent(false);
|
|
|
var sendReceiveToken = new PartialSendReceiveToken(socket, receiveCompleted);
|
|
|
@@ -196,6 +208,8 @@ namespace Renci.SshNet.Abstractions
|
|
|
var totalBytesRead = 0;
|
|
|
var totalBytesToRead = size;
|
|
|
|
|
|
+ socket.ReceiveTimeout = (int) timeout.TotalMilliseconds;
|
|
|
+
|
|
|
do
|
|
|
{
|
|
|
try
|
|
|
@@ -213,6 +227,11 @@ namespace Renci.SshNet.Abstractions
|
|
|
ThreadAbstraction.Sleep(30);
|
|
|
continue;
|
|
|
}
|
|
|
+
|
|
|
+ if (ex.SocketErrorCode == SocketError.TimedOut)
|
|
|
+ throw new SshOperationTimeoutException(string.Format(CultureInfo.InvariantCulture,
|
|
|
+ "Socket read operation has timed out after {0:F0} milliseconds.", timeout.TotalMilliseconds));
|
|
|
+
|
|
|
throw;
|
|
|
}
|
|
|
}
|
|
|
@@ -329,7 +348,7 @@ namespace Renci.SshNet.Abstractions
|
|
|
#endif
|
|
|
}
|
|
|
|
|
|
- private static bool IsErrorResumable(SocketError socketError)
|
|
|
+ public static bool IsErrorResumable(SocketError socketError)
|
|
|
{
|
|
|
switch (socketError)
|
|
|
{
|