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

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

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

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

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

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

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


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

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

10   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы