Неполадки с передачей данных по сокетам - C#

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

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

Здравствуйте Я сделал программу, которая передает по сокетам файл. Сокеты - типа Stream с протоколом TCP. Если я запускаю программу на локальном адресе (127.0.0.1), то все в порядке, файлы корректно передаются, без ошибок. Но если я передаю этот файл даже по локальной сети, то передается всего 1920 Байт. Немного изменил структуру кода, теперь передается всего 1460 байт. В чем проблемма? С чем это связано? Как это пофиксить? Код (Меню для запуска сервера и клиента):
Листинг программы
  1. Console.Clear();
  2. Console.WriteLine("Введите 0 для режима "Сервер", 1 для режима "Клиент"");
  3. string _choice = Console.ReadLine();
  4. if (_choice == "0") { Server(); }
  5. if (_choice == "1") { Client(); }
  6. else
  7. {
  8. Console.Clear();
  9. Console.WriteLine("Неверно выбран режим сокета");
  10. Console.ReadKey();
  11. }
  12. void Server()
  13. {
  14. Console.Clear();
  15. IPEndPoint _EndIP1 = new IPEndPoint(IPAddress.Parse("192.168.1.64"), 47001);
  16. IPEndPoint _EndIP2 = new IPEndPoint(IPAddress.Parse("192.168.1.64"), 47002);
  17. _RecieveData();
  18. void _RecieveData()
  19. {
  20. try
  21. {
  22. String _FileName = null;
  23. Console.WriteLine("Ожидание подключений...");
  24. _RecieveFileName();
  25. _RecieveFileData();
  26. void _RecieveFileName()
  27. {
  28. using (Socket _ServerS = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
  29. {
  30. _ServerS.Bind(_EndIP1);
  31. _ServerS.Listen(1);
  32. using (Socket _ClientS = _ServerS.Accept())
  33. {
  34. Console.WriteLine("Получение данных о файле...");
  35. int _Count = 0;
  36. byte[] _Buffer = new byte[256];
  37. do
  38. {
  39. _Count = _ClientS.Receive(_Buffer);
  40. _FileName = _FileName + Encoding.Default.GetString(_Buffer, 0, _Count);
  41. } while (_ClientS.Available > 0);
  42. Console.WriteLine("Данные о файле получены...");
  43. }
  44. }
  45. }
  46. void _RecieveFileData()
  47. {
  48. using (Socket _ServerS = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
  49. {
  50. _ServerS.Bind(_EndIP2);
  51. _ServerS.Listen(1);
  52. using (Socket _ClientS = _ServerS.Accept())
  53. {
  54. Console.WriteLine("Скачивание файла...");
  55. using(MemoryStream _File = new MemoryStream())
  56. {
  57. int _Count = 0;
  58. byte[] _Buffer = new byte[1];
  59. do
  60. {
  61. _Count = _ClientS.Receive(_Buffer);
  62. _File.Write(_Buffer, 0, _Count);
  63. } while (_ClientS.Available > 0);
  64. Console.WriteLine("Скачивание файла завершено...");
  65. using (FileStream _FS = new FileStream(_FileName, FileMode.Create))
  66. {
  67. _File.Position = 0;
  68. _File.CopyTo(_FS);
  69. Console.WriteLine("Файл {0} размером {1} Байт сохранен...\n", _FileName, _File.Length);
  70. }
  71. }
  72. }
  73. }
  74. }
  75. _RecieveData();
  76. }
  77. catch (Exception _ex)
  78. {
  79. Console.WriteLine(_ex);
  80. Console.ReadKey();
  81. _RecieveData();
  82. }
  83. }
  84. }
  85. void Client()
  86. {
  87. Console.Clear();
  88. Console.WriteLine("Введите конечный IP");
  89. IPAddress _IPAddr = IPAddress.Parse(Console.ReadLine());
  90. IPEndPoint _EndIP1 = new IPEndPoint(_IPAddr, 47001);
  91. IPEndPoint _EndIP2 = new IPEndPoint(_IPAddr, 47002);
  92. _TransferData();
  93. void _TransferData()
  94. {
  95. try
  96. {
  97. Byte[] _FileName = null;
  98. Byte[] _File = null;
  99. Console.Clear();
  100. Console.WriteLine("Нажмите для выбора файла...");
  101. Console.ReadKey();
  102. OpenFileDialog _OFD = new OpenFileDialog();
  103. if ((_OFD.ShowDialog()) != DialogResult.OK)
  104. {
  105. Console.Clear();
  106. Console.WriteLine("Не выбран файл");
  107. Console.ReadKey();
  108. _TransferData();
  109. }
  110. string[] _FileFullName = _OFD.FileName.Split('\\');
  111. _FileName = Encoding.Default.GetBytes(_FileFullName[_FileFullName.Length - 1]);
  112. using (FileStream _FS = new FileStream(_OFD.FileName, FileMode.Open))
  113. {
  114. _File = new Byte[_FS.Length];
  115. _FS.Read(_File, 0, _File.Length);
  116. }
  117. Console.WriteLine("Обработка файла завершена. Соединение с сервером...");
  118. using (Socket _ClientFI = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
  119. {
  120. _ClientFI.Connect(_EndIP1);
  121. Console.WriteLine("Отправка информации о файле...");
  122. _ClientFI.Send(_FileName);
  123. Console.WriteLine("Информация о файле отправлена...");
  124. }
  125. Thread.Sleep(50);
  126. using (Socket _ClientFD = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
  127. {
  128. _ClientFD.Connect(_EndIP2);
  129. Console.WriteLine("Отправка файла...");
  130. _ClientFD.Send(_File);
  131. Console.WriteLine("Файл отправлен...");
  132. }
  133. Console.ReadKey();
  134. _TransferData();
  135. }
  136. catch (Exception _ex)
  137. {
  138. Console.WriteLine(_ex);
  139. Console.ReadKey();
  140. _TransferData();
  141. }
  142. }
  143. }
Заранее пре-благодарен тем, кто помог

Решение задачи: «Неполадки с передачей данных по сокетам»

textual
Листинг программы
  1. } while (_ClientS.Available > 0);

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


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

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

8   голосов , оценка 3.5 из 5

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

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

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