static long DownloadFile(Stream stream, string fileName, bool closeServer, Action <long> onStarted) { Console.WriteLine("About to download file '{0}'", fileName); var request = new TransferFileJobRequest { FileName = fileName, IsDone = closeServer, DownloadFromServer = true, }; SendReceiveHelper.SendTransferRequest(stream, request); var response = SendReceiveHelper.GetTransferFileJobResponse(stream); if (response.Status != 0) { throw new InvalidOperationException($"Error from server: {response.Status}"); } var length = (long)response.Size; onStarted?.Invoke(length); var fi = new FileInfo(fileName); Console.WriteLine($"Downloading file {fi.Name} of size {length}"); using (var file = File.OpenWrite(fi.Name)) { stream.CopyTo(file); } Console.WriteLine("File '{0}' received", fileName); return(length); }
static void UploadFile(Stream stream, FileInfo fileInfo, bool closeServer) { Console.WriteLine("About to transfer file '{0}' of size {1} ", fileInfo.FullName, fileInfo.Length); var request = new TransferFileJobRequest { FileName = fileInfo.Name, Size = (ulong)fileInfo.Length, IsDone = closeServer, DownloadFromServer = false, }; SendReceiveHelper.SendTransferRequest(stream, request); var response = SendReceiveHelper.GetTransferFileJobResponse(stream); if (response.Status != 0) { throw new InvalidOperationException($"Error from server: {response.Status}"); } Console.WriteLine("Transferring file"); using (var file = File.OpenRead(fileInfo.FullName)) { file.CopyTo(stream); } Console.WriteLine("File '{0}' sent!", fileInfo.Name); }
static void ReceiveFile(Stream stream, string fileName, long length) { Console.WriteLine("Writing file {0}", fileName); using (var file = File.OpenWrite(fileName)) { SendReceiveHelper.CopyStream(stream, file, length); } }
public void SendTransferFileResponse_Test() { using (var ms = new MemoryStream()) { SendReceiveHelper.SendTransferFileJobResponse(ms, new TransferFileJobResponse() { Size = 33, Status = 33 }); ms.Position = 0; var req = SendReceiveHelper.GetTransferFileJobResponse(ms); Assert.AreEqual(req.Size, 33U); Assert.AreEqual(req.Status, 33); } }
public void TransferRequest_Test() { var fn = "Boo"; using (var ms = new MemoryStream()) { SendReceiveHelper.SendTransferRequest(ms, new TransferFileJobRequest { FileName = fn, Size = 33, }); ms.Position = 0; var req = SendReceiveHelper.GetTransferRequest(ms); Assert.AreEqual(req.Size, 33UL); Assert.AreEqual(req.FileName, fn); } }
static void Main(string[] args) { try { Console.CancelKeyPress += cancelHandler; listener = new TcpListener(IPAddress.Parse("0.0.0.0"), PORT); listener.Start(); Console.WriteLine($"Waiting for connection at :{PORT}"); Console.Write("Press any key, or 'C' to quit"); while (true) { using (var client = listener.AcceptTcpClient()) using (var stream = client.GetStream()) { Console.WriteLine("connected"); var request = SendReceiveHelper.GetTransferRequest(stream); Console.WriteLine("Got file name {0} for {1}", request.FileName, request.DownloadFromServer?"download":"upload"); var isReceive = !request.DownloadFromServer; if (isReceive) { SendReceiveHelper.SendTransferFileJobResponse(stream, new TransferFileJobResponse() { Size = request.Size, Status = 0, }); using (new AutoStopwatch((long)request.Size)) { ReceiveFile(stream, request.FileName, (long)request.Size); } } else { var fi = new FileInfo(request.FileName); if (fi.Exists) { SendReceiveHelper.SendTransferFileJobResponse(stream, new TransferFileJobResponse() { Size = (ulong)fi.Length, Status = 0, }); using (new AutoStopwatch(fi.Length)) { SendFile(stream, fi); } } else { SendReceiveHelper.SendTransferFileJobResponse(stream, new TransferFileJobResponse() { Size = 0, Status = 1, }); } } Console.WriteLine("Done {0}", request.IsDone ? "stopping server." : ""); if (request.IsDone) { break; } } } } catch (SocketException ex) { Console.WriteLine("Interrupted {0}", ex.Message); } catch (Exception ex) { Console.WriteLine("Caught {0}", ex.Message); } finally { listener?.Stop(); } }