in SimpleDUTRemote/HelperFunctions/LargeFileTransfers.cs [22:76]
public static void Upload(string path, TcpListener server, bool overwrite)
{
logger.Info($"Waiting for connection for directory transfer on port {((IPEndPoint)server.LocalEndpoint).Port}");
var connection = server.AcceptTcpClientAsync();
#if DEBUG
connection.Wait();
#else
bool status = connection.Wait(10 * 1000);
if (!status)
{
logger.Warn($"Timed out waiting for client to begin uploading directory. Closing port.");
server.Stop();
return;
}
#endif
server.Stop();
using (var client = connection.Result)
using (var stream = client.GetStream())
{
try
{
//var bytesReceived = ZipFunctions.ReadDirectoryFromStream(stream, path, overwrite);
var bytesReceived = TarFunctions.ReadFileOrDirectoryFromStream(stream, path, overwrite,
closeStreamWhenComplete: false);
logger.Info($"Successfully received {bytesReceived} bytes, written to {path}");
// Depending on the record size settings, tar can legally end up sending extra null blocks.
// If it did, and we try to shutdown the socket without reading the remaining bytes,
// it will trigger an RST packet. We can avoid this by clearing the inbound socket buffer.
var dummyBuffer = new byte[1024];
while (stream.DataAvailable){
stream.Read(dummyBuffer, 0, 1024);
}
// attempt to send back byte count to the client before shutting down the connection
try
{
var temp = Encoding.ASCII.GetBytes(bytesReceived.ToString() + "\r\n");
stream.Write(temp, 0, temp.Length);
}
catch (IOException e)
{
logger.Info("Upload was successful, but client disconnected before byte-count could be sent back.");
}
}
catch (Exception e)
{
logger.Error(e, "Upload failed.");
}
}
}