Quantcast
Channel: sshnet Issue Tracker Rss Feed
Viewing all articles
Browse latest Browse all 1026

Commented Unassigned: SCPClient hangs (downloading) when connections problem occurred [1895]

$
0
0
SCPClient hangs (downloading) when connections problem occurred on Version: 2013.4.7

Simple way of reproduction:
1. Remove scp (/var/bin/scp) from remote mashine.
2. Try to download some file from this mashine.
3. Downloading hungs...

I think, there is some problem with PipeStream interaction (PipeStream has no reaction on disconnect or other connection problems).

My Code
```
_scp = new Renci.SshNet.ScpClient(_host, _login, _password);
_scp.Connect();
_scp.Download(filename, file);
```

First hangs thread:
> Renci.SshNet.dll!Renci.SshNet.Common.PipeStream.Read(byte[] buffer, int offset, int count) Line 181 + 0xb bytes C#
mscorlib.dll!System.IO.Stream.ReadByte() + 0x28 bytes
Renci.SshNet.dll!Renci.SshNet.ScpClient.ReadByte(System.IO.Stream stream) Line 367 + 0xb bytes C#
Renci.SshNet.dll!Renci.SshNet.ScpClient.ReadString(System.IO.Stream stream) Line 384 + 0x8 bytes C#
Renci.SshNet.dll!Renci.SshNet.ScpClient.InternalDownload(Renci.SshNet.Channels.ChannelSession channel, System.IO.Stream input, System.IO.FileSystemInfo fileSystemInfo) Line 217 + 0x8 bytes C#
Renci.SshNet.dll!Renci.SshNet.ScpClient.Download(string filename, System.IO.FileInfo fileInfo) Line 132 + 0x14 bytes C#

```
Renci.SshNet.dll!Renci.SshNet.Common.PipeStream.Read
...
while (!this.ReadAvailable(count))
Monitor.Wait(this._buffer); // (will hungs infinite due to disconnection state - no one will write in PipeStream)
```
Second hangs thread:
> System.dll!System.Net.Sockets.Socket.Receive(byte[] buffer, int offset, int size, System.Net.Sockets.SocketFlags socketFlags, out System.Net.Sockets.SocketError errorCode) + 0xc6 bytes
System.dll!System.Net.Sockets.Socket.Receive(byte[] buffer, int offset, int size, System.Net.Sockets.SocketFlags socketFlags) + 0x20 bytes
Renci.SshNet.dll!Renci.SshNet.Session.SocketRead(int length, ref byte[] buffer) Line 115 + 0x34 bytes C#
Renci.SshNet.dll!Renci.SshNet.Session.Read(int length) Line 1500 + 0xf bytes C#
Renci.SshNet.dll!Renci.SshNet.Session.ReceiveMessage() Line 805 + 0xb bytes C#
Renci.SshNet.dll!Renci.SshNet.Session.MessageListener() Line 1582 + 0x8 bytes C#
Renci.SshNet.dll!Renci.SshNet.Session.Connect.AnonymousMethod__4() Line 529 + 0x8 bytes C#
Renci.SshNet.dll!Renci.SshNet.Session.ExecuteThread.AnonymousMethod__3c(object o) Line 25 + 0xf bytes C#
mscorlib.dll!System.Threading.QueueUserWorkItemCallback.WaitCallback_Context(object state) + 0x2d bytes
mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state, bool ignoreSyncCtx) + 0xb0 bytes
mscorlib.dll!System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem() + 0x5a bytes
mscorlib.dll!System.Threading.ThreadPoolWorkQueue.Dispatch() + 0x147 bytes
mscorlib.dll!System.Threading._ThreadPoolWaitCallback.PerformWaitCallback() + 0x2d bytes
[Native to Managed Transition]

```
partial void SocketRead(int length, ref byte[] buffer)
{
var offset = 0;
int receivedTotal = 0; // how many bytes is already received
do
{
try
{
var receivedBytes = this._socket.Receive(buffer, offset + receivedTotal, length - receivedTotal, SocketFlags.None); // hungs here
if (receivedBytes > 0)
```
------- output ----------------
SshNet.Logging Verbose: 1 : Initiating connect to '.............'.
SshNet.Logging Verbose: 1 : Server version '2.0' on 'OpenSSH_5.9p1 Debian-5ubuntu1.1'.
SshNet.Logging Verbose: 1 : ReceiveMessage from server: 'KeyExchangeInitMessage': 'SSH_MSG_KEXINIT'.
'TestDownload.vshost.exe' (Managed (v4.0.30319)): Loaded 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Dynamic\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Dynamic.dll'
'TestDownload.vshost.exe' (Managed (v4.0.30319)): Loaded 'Anonymously Hosted DynamicMethods Assembly'
SshNet.Logging Verbose: 1 : SendMessage to server 'KeyExchangeInitMessage': 'SSH_MSG_KEXINIT'.
SshNet.Logging Verbose: 1 : SendMessage to server 'KeyExchangeDhGroupExchangeRequest': 'SSH_MSG_KEX_DH_GEX_REQUEST'.
SshNet.Logging Verbose: 1 : ReceiveMessage from server: 'KeyExchangeDhGroupExchangeGroup': 'SSH_MSG_KEX_DH_GEX_GROUP'.
SshNet.Logging Verbose: 1 : SendMessage to server 'KeyExchangeDhGroupExchangeInit': 'SSH_MSG_KEX_DH_GEX_INIT'.
SshNet.Logging Verbose: 1 : ReceiveMessage from server: 'KeyExchangeDhGroupExchangeReply': 'SSH_MSG_KEX_DH_GEX_REPLY'.
SshNet.Logging Verbose: 1 : SendMessage to server 'NewKeysMessage': 'SSH_MSG_NEWKEYS'.
SshNet.Logging Verbose: 1 : ReceiveMessage from server: 'NewKeysMessage': 'SSH_MSG_NEWKEYS'.
SshNet.Logging Verbose: 1 : SendMessage to server 'ServiceRequestMessage': 'SSH_MSG_SERVICE_REQUEST'.
SshNet.Logging Verbose: 1 : ReceiveMessage from server: 'ServiceAcceptMessage': 'SSH_MSG_SERVICE_ACCEPT'.
SshNet.Logging Verbose: 1 : SendMessage to server 'RequestMessageNone': 'SSH_MSG_USERAUTH_REQUEST'.
The thread '<No Name>' (0x724) has exited with code 0 (0x0).
SshNet.Logging Verbose: 1 : ReceiveMessage from server: 'FailureMessage': 'SSH_MSG_USERAUTH_FAILURE'.
SshNet.Logging Verbose: 1 : SendMessage to server 'RequestMessagePassword': 'SSH_MSG_USERAUTH_REQUEST'.
SshNet.Logging Verbose: 1 : ReceiveMessage from server: 'SuccessMessage': 'SSH_MSG_USERAUTH_SUCCESS'.
SshNet.Logging Verbose: 1 : SendMessage to server 'ChannelOpenMessage': 'SSH_MSG_CHANNEL_OPEN : #0'.
SshNet.Logging Verbose: 1 : ReceiveMessage from server: 'ChannelOpenConfirmationMessage': 'SSH_MSG_CHANNEL_OPEN_CONFIRMATION : #0'.
SshNet.Logging Verbose: 1 : SendMessage to server 'ChannelRequestMessage': 'SSH_MSG_CHANNEL_REQUEST : #0'.
SshNet.Logging Verbose: 1 : ReceiveMessage from server: 'ChannelWindowAdjustMessage': 'SSH_MSG_CHANNEL_WINDOW_ADJUST : #0'.
SshNet.Logging Verbose: 1 : ReceiveMessage from server: 'ChannelSuccessMessage': 'SSH_MSG_CHANNEL_SUCCESS : #0'.
SshNet.Logging Verbose: 1 : ReceiveMessage from server: 'ChannelRequestMessage': 'SSH_MSG_CHANNEL_REQUEST : #0'.
SshNet.Logging Verbose: 1 : SendMessage to server 'ChannelDataMessage': 'SSH_MSG_CHANNEL_DATA : #0'.
SshNet.Logging Verbose: 1 : ReceiveMessage from server: 'ChannelExtendedDataMessage': 'SSH_MSG_CHANNEL_EXTENDED_DATA : #0'.
SshNet.Logging Verbose: 1 : ReceiveMessage from server: 'ChannelEofMessage': 'SSH_MSG_CHANNEL_EOF : #0'.
SshNet.Logging Verbose: 1 : ReceiveMessage from server: 'ChannelCloseMessage': 'SSH_MSG_CHANNEL_CLOSE : #0'.
SshNet.Logging Verbose: 1 : SendMessage to server 'ChannelCloseMessage': 'SSH_MSG_CHANNEL_CLOSE : #0'.
SshNet.Logging Verbose: 1 : SendMessage to server 'IgnoreMessage': 'SSH_MSG_IGNORE'.
The thread '<No Name>' (0x2254) has exited with code 0 (0x0).
The thread '<No Name>' (0x1474) has exited with code 0 (0x0).
SshNet.Logging Verbose: 1 : SendMessage to server 'IgnoreMessage': 'SSH_MSG_IGNORE'.
The thread '<No Name>' (0xeb8) has exited with code 0 (0x0).
The thread '<No Name>' (0x27d8) has exited with code 0 (0x0).
The thread '<No Name>' (0x13f8) has exited with code 0 (0x0).
SshNet.Logging Verbose: 1 : SendMessage to server 'IgnoreMessage': 'SSH_MSG_IGNORE'.
SshNet.Logging Verbose: 1 : SendMessage to server 'IgnoreMessage': 'SSH_MSG_IGNORE'.
Comments: ** Comment from web user: Euan **

I haven't tried it with a public ssh, I'm just using a fairly generic local linux box to grab some files.

Using this code

```
private void GetFilesFromIPC(List<string> files, string directory)
{
using (var scp = new ScpClient(args.ip, args.username, args.password))
{
scp.ConnectionInfo.Timeout = TimeSpan.FromMilliseconds(SettingsInst.Settings.General.NetTimeout);
scp.ConnectionInfo.RetryAttempts = 3;
scp.OperationTimeout = scp.ConnectionInfo.Timeout;

string appendSrc = "";

if (args.appendSrcIPToReceivedFiles)
{
appendSrc = args.ip + "-";
}

try
{
scp.Connect();
}
catch (Exception e)
{
OnUpdateHandler(false, "SCP Error", e.Message);
worker.ReportProgress(100);
return;
}

scp.Downloading += delegate(object sender, ScpDownloadEventArgs e)
{
Trace.WriteLine(e.Filename + ":" + e.Size + ":" + e.Downloaded);
worker.ReportProgress((int)((100.0 / (double)e.Size) * e.Downloaded), e);
};

scp.ErrorOccurred += delegate(object sender, ExceptionEventArgs e)
{
Trace.WriteLine(e.Exception.Message);
OnUpdateHandler(false, "SCP Error", e.Exception.Message);
worker.ReportProgress(100);
// scp.Disconnect();
return;
};

try
{
Parallel.ForEach(files, new ParallelOptions { MaxDegreeOfParallelism = 5, CancellationToken = cts.Token },
(filename) =>
{
try
{
string fName = filename;
if (filename.Contains('/'))
{
fName = filename.Substring(filename.LastIndexOf('/') + 1);
}
FileStream f = File.Create(args.localFolder + "\\" + appendSrc + fName, 4096, FileOptions.SequentialScan);
scp.Download(directory + filename, f);//, true);
f.Close();
}
catch (Exception e)
{
progressItem it = items.Single(itm => itm.path.Contains(filename));
it.status = "ERROR";
OnUpdateHandler(false, "SCP Error", e.Message);
worker.ReportProgress(100);
cts.Cancel();
}
});

OnUpdateHandler(true, "OK");
}
catch (OperationCanceledException oce)
{
OnUpdateHandler(true, oce.Message);
}
catch (Exception ex)
{
OnUpdateHandler(true, ex.Message);
System.Diagnostics.Trace.WriteLine(ex.Message);
}
scp.Disconnect();
}
}

```


Viewing all articles
Browse latest Browse all 1026

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>