Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
 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);
     }
 }
Ejemplo n.º 4
0
        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);
            }
        }
Ejemplo n.º 5
0
        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);
            }
        }
Ejemplo n.º 6
0
        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();
            }
        }