Die Dateien werden auf einem Remote-Server gespeichert und ich zeige dem Client ein gefälschtes Dateisystem.
Wenn der Client eine Datei herunterladen möchte, führe ich mit der ssh_fxp_open-Anfrage eine neue Aufgabe aus, um die Datei im Hintergrund herunterzuladen.
Während der Download noch nicht abgeschlossen ist, sende ich an die ssh_fxp_read-Anfrage jedes Clients leere Daten.
Codebeispiel:
Code: Select all
HandleOpenRequest(SshData request)
{
.
.
Task.Run(()=>{ /*download the file; add the file path to concurrentDictionary*/ });
.
.
Send handle
}
HandleReadRequest(SshData request)
{
SshData writer = new SshData();
var requestId request.ReadInt();
var handle = request.ReadString();
if(download complete)
{
fs = get fileStream from dictionary;
var offset = request.ReadInt64();
var length = request.ReadInt();
var buffer = new byte[length];
writer.write(messageType.data);
writer.write(requestId);
.
.
// Handle eof buffer
.
.
fs.Seek(offset, SeekOrigin.Begin);
fs.Read(buffer, 0, buffer.length);
writer.write(buffer);
SendPacket(writer);
}
else
{
// Sleep 1 second;
writer.write(messageType.data);
writer.write(requestId);
writer.write(new byte[0]);
SendPacket(writer);
}
}
Ich verwende WinSCP als SFTP-Client.
Was mache ich falsch und wie kann ich das beheben?
Ich habe versucht, die Paketgröße zu ändern, aber es hat nicht geholfen.
Mobile version