Передача файлов без потерь - C#
Формулировка задачи:
Всем привет! Подскажите каким образом организовать передачу файлов по локалке без потерь(протокол TCP)?
Есть у меня код по передаче файлов, мелкие файлы (примерно до 20 мб) передаёт нормально, а вот побольше которые, идут с потерями.
Сервер:
Клиент:
protected void FileReceiver() { string myHost = System.Net.Dns.GetHostName(); string myIP = System.Net.Dns.GetHostByName(myHost).AddressList[0].ToString(); IPAddress localAddr = IPAddress.Parse(myIP); TcpListener Listen = new TcpListener(localAddr, 6999); Listen.Start(); Socket ReceiveSocket; while (true) { try { ReceiveSocket = Listen.AcceptSocket(); Byte[ ] Receive = new Byte[ 256]; using (MemoryStream MessageR = new MemoryStream()) { Int32 ReceivedBytes; Int32 Firest256Bytes = 0 ; String FilePath = "" ; do { ReceivedBytes = ReceiveSocket.Receive(Receive, Receive.Length, 0 ); //Разбираем первые 256 байт if (Firest256Bytes < 256 ) { Firest256Bytes += ReceivedBytes; Byte[ ] ToStr = Receive; if (Firest256Bytes > 256 ) { Int32 Start = Firest256Bytes - ReceivedBytes; Int32 CountToGet = 256 - Start; Firest256Bytes = 256 ; ToStr = Receive.Take(CountToGet).ToArray(); Receive = Receive.Skip(CountToGet).ToArray(); MessageR.Write(Receive, 0 , ReceivedBytes); } FilePath += Encoding.Default.GetString(ToStr); } else MessageR.Write(Receive, 0 , ReceivedBytes); } while (ReceivedBytes == Receive.Length); String resFilePath = FilePath.Substring(0, FilePath.IndexOf("\0" )); using (var File = new FileStream(resFilePath, FileMode.Create)) { File.Write(MessageR.ToArray(), 0 , MessageR.ToArray().Length); } ChatBox.BeginInvoke(AcceptDelegate, new object[ ] { "Received: " + resFilePath, ChatBox }); } } catch (System.Exception ex) { MessageBox.Show(ex.Message); } } }
private void button3_Click(object sender, EventArgs e) { if (openFileDialog1.ShowDialog() == DialogResult.OK) { IPEndPoint EndPoint = new IPEndPoint(IPAddress.Parse(IP.Text), 6999); Socket Connector = new Socket(EndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp); Connector.Connect(EndPoint); StringBuilder FileName = new StringBuilder(openFileDialog1.FileName); MessageBox.Show(openFileDialog1.FileName); int index = FileName.Length - 1; while (FileName[index] != '\\' && FileName[index] != '/') { index--; } String resFileName = ""; for (int i = index + 1; i < FileName.Length; i++) resFileName += FileName[i]; List<Byte> First256Bytes = Encoding.Default.GetBytes(resFileName).ToList(); Int32 Diff = 256 - First256Bytes.Count; for (int i = 0; i < Diff; i++) First256Bytes.Add(0); Byte[] ReadedBytes = new Byte[256]; using (var FileStream = new FileStream(openFileDialog1.FileName, FileMode.Open)) { using (var Reader = new BinaryReader(FileStream)) { Int32 CurrentReadedBytesCount; Connector.Send(First256Bytes.ToArray()); do { CurrentReadedBytesCount = Reader.Read(ReadedBytes, 0, ReadedBytes.Length); Connector.Send(ReadedBytes, CurrentReadedBytesCount, SocketFlags.None); } while (CurrentReadedBytesCount == ReadedBytes.Length); } } Connector.Close(); } }
Люди, кто понимает подскажите как организовать это без потерь. Код переправлять не надо, я сам всё сделаю, просто дайте совет!
Решение задачи: «Передача файлов без потерь»
textual
Листинг программы
string fileName = Encoding.UTF8.GetString(first256Bytes, 0, Array.IndexOf(first256Bytes, 0));
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д