Прием файлов по сокетам - C#

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

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

Реализую прием файлов по сокетам. Проблема в том, что файл приходит не весь. Причем если тестирую в местной сети, то все нормально. Но когда запускаю удаленно, то эти же файлы НЕ ВСЕГДА приходят полностью? Подскажите что не так? Вот часть кода: На стороне сервера шлю размер файла и затем сам файл:
Листинг программы
  1. connection.Socket.Send(Encoding.GetEncoding(1251).GetBytes(fl.Length.ToString()));
  2. connection.Socket.SendFile(GetInformation);
На стороне клиента:
Листинг программы
  1. if (trabl) //подключился!
  2. {
  3. string fileSize = RecvSize(); //получаем размер файла
  4. if (fileSize != "")
  5. {
  6. if (!RecvFile(flName, Convert.ToInt32(fileSize))) //результат получения файла
  7. MessageBox.Show("Получена только часть файла");
  8. }
  9. sock.Shutdown(SocketShutdown.Both);
  10. sock.Close();
  11. }
  12. //получаем размер файла
  13. private string RecvSize()
  14. {
  15. string sizeFl = "";
  16. if (sock.Connected)
  17. {
  18. string message = "";
  19. int y = 0;
  20. while (y == 0)
  21. {
  22. byte[] bytes = new byte[1024];
  23. int BytesRec = sock.Receive(bytes);
  24. message = Encoding.GetEncoding(1251).GetString(bytes, 0, BytesRec);
  25. if (1024 - BytesRec != 0) y++;
  26. }
  27. if (message != "")
  28. sizeFl = message;
  29. }
  30. return sizeFl;
  31. }
  32. //прием файла
  33. private bool RecvFile(string nameFl, int sizeFl)
  34. {
  35. bool tr = false;
  36. if (sock.Connected)
  37. {
  38. string message = "";
  39. int y = 0;
  40. while (y == 0)
  41. {
  42. byte[] bytes = new byte[1024];
  43. int BytesRec = sock.Receive(bytes);
  44. message += Encoding.GetEncoding(1251).GetString(bytes, 0, BytesRec); //получаем все пакеты
  45. if (1024 - BytesRec != 0) y++;
  46. }
  47. if (message != "")
  48. {
  49. StreamWriter sw = new StreamWriter(nameFl, false, Encoding.GetEncoding(1251));
  50. sw.Write(message);
  51. sw.Flush();
  52. sw.Close();
  53. FileInfo fi = new FileInfo(nameFl);
  54. if (fi.Length == sizeFl) tr = true;
  55. }
  56. }
  57. return tr;
  58. }

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

textual
Листинг программы
  1. SendingFl(_tempMsg, "<EndMsg>"); //отправляем файл сообщения
  2. private void SendingFl(string fl, string lbl)
  3. {
  4.   StreamReader sr = new StreamReader(fl, Encoding.GetEncoding(1251));
  5.   string str = sr.ReadToEnd();
  6.   if (sock.Connected)
  7.   {
  8.     byte[] msg = Encoding.GetEncoding(1251).GetBytes(str + lbl); //добавляем метку конца файла
  9.     sock.Send(msg); //отправляем байты
  10.   }
  11.   sr.Close();
  12. }

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


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

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

9   голосов , оценка 4.111 из 5

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

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

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