Передача файла через сокет - C#

Узнай цену своей работы

Формулировка задачи:

Итак... у меня сложилась одна затруднительная ситуация. Есть сервер, есть клиент. С передает К файл посредством
client.SendFile(filename, null, null, TransmitFileOptions.UseDefaultWorkerThread);
клиент принимает
   MemoryStream memstr = new MemoryStream();
                FileStream fs = File.Create(package_name);
 
                while (true)
                {
                    buffer = new byte[4096];
                    int o = server.Receive(buffer);
                    if (o == 0)
                    {
                        break;
                    }
                    memstr.Write(buffer, 0, buffer.Length);
                }
                memstr.WriteTo(fs);
                fs.Close();
                memstr.Close();
в итоге получаем файл с большим размером, чем оригинал... ну ладн, это несложно преодолеть написав
// size - это размер файла
MemoryStream memstr = new MemoryStream();
                FileStream fs = File.Create(package_name);
                long received = 0;
                while (true)
                {
                    if (received + 4096 > size)
                    {
                        buffer = new byte[size-received];
                        server.Receive(buffer);  
                        memstr.Write(buffer, 0, buffer.Length);
                        break;
                    }
                    buffer = new byte[4096];
                    server.Receive(buffer);
                    received = received + 4096;
                    memstr.Write(buffer, 0, buffer.Length);
                }
                memstr.WriteTo(fs);
                fs.Close();
                memstr.Close();
получаем на выходе файл аналогичного размера, что и оригинал, НО он не запускается. Если же сделать буфер равный 1 байту, то на выходе получается рабочий файл. Но это цикл на 4 млн проходов при файле в 4 мб. это нехорошо...
MemoryStream memstr = new MemoryStream();
                FileStream fs = File.Create(package_name);
 
                while (true)
                {
                    buffer = new byte[1];
                    int o = server.Receive(buffer);
                    if (o == 0)
                    {
                        break;
                    }
                    memstr.Write(buffer, 0, buffer.Length);
                }
                memstr.WriteTo(fs);
                fs.Close();
                memstr.Close();
Может кто объяснить почему так? И как исправить эту проблему. Если честно сутки просидел над этими 10 строчками кода, но так и не понял почему файл получается нерабочим во 2 варианте

Решение задачи: «Передача файла через сокет»

textual
Листинг программы
file.Write(data, 0, recv);

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


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

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

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