Передача файлов без потерь - 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));

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 3.818 из 5
Похожие ответы