Неполадки с передачей данных по сокетам - C#
Формулировка задачи:
Здравствуйте
Я сделал программу, которая передает по сокетам файл. Сокеты - типа Stream с протоколом TCP. Если я запускаю программу на локальном адресе (127.0.0.1), то все в порядке, файлы корректно передаются, без ошибок. Но если я передаю этот файл даже по локальной сети, то передается всего 1920 Байт. Немного изменил структуру кода, теперь передается всего 1460 байт. В чем проблемма? С чем это связано? Как это пофиксить?
Код (Меню для запуска сервера и клиента):
Заранее пре-благодарен тем, кто помог
Console.Clear(); Console.WriteLine("Введите 0 для режима "Сервер", 1 для режима "Клиент""); string _choice = Console.ReadLine(); if (_choice == "0") { Server(); } if (_choice == "1") { Client(); } else { Console.Clear(); Console.WriteLine("Неверно выбран режим сокета"); Console.ReadKey(); } void Server() { Console.Clear(); IPEndPoint _EndIP1 = new IPEndPoint(IPAddress.Parse("192.168.1.64"), 47001); IPEndPoint _EndIP2 = new IPEndPoint(IPAddress.Parse("192.168.1.64"), 47002); _RecieveData(); void _RecieveData() { try { String _FileName = null; Console.WriteLine("Ожидание подключений..."); _RecieveFileName(); _RecieveFileData(); void _RecieveFileName() { using (Socket _ServerS = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) { _ServerS.Bind(_EndIP1); _ServerS.Listen(1); using (Socket _ClientS = _ServerS.Accept()) { Console.WriteLine("Получение данных о файле..."); int _Count = 0; byte[] _Buffer = new byte[256]; do { _Count = _ClientS.Receive(_Buffer); _FileName = _FileName + Encoding.Default.GetString(_Buffer, 0, _Count); } while (_ClientS.Available > 0); Console.WriteLine("Данные о файле получены..."); } } } void _RecieveFileData() { using (Socket _ServerS = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) { _ServerS.Bind(_EndIP2); _ServerS.Listen(1); using (Socket _ClientS = _ServerS.Accept()) { Console.WriteLine("Скачивание файла..."); using(MemoryStream _File = new MemoryStream()) { int _Count = 0; byte[] _Buffer = new byte[1]; do { _Count = _ClientS.Receive(_Buffer); _File.Write(_Buffer, 0, _Count); } while (_ClientS.Available > 0); Console.WriteLine("Скачивание файла завершено..."); using (FileStream _FS = new FileStream(_FileName, FileMode.Create)) { _File.Position = 0; _File.CopyTo(_FS); Console.WriteLine("Файл {0} размером {1} Байт сохранен...\n", _FileName, _File.Length); } } } } } _RecieveData(); } catch (Exception _ex) { Console.WriteLine(_ex); Console.ReadKey(); _RecieveData(); } } } void Client() { Console.Clear(); Console.WriteLine("Введите конечный IP"); IPAddress _IPAddr = IPAddress.Parse(Console.ReadLine()); IPEndPoint _EndIP1 = new IPEndPoint(_IPAddr, 47001); IPEndPoint _EndIP2 = new IPEndPoint(_IPAddr, 47002); _TransferData(); void _TransferData() { try { Byte[] _FileName = null; Byte[] _File = null; Console.Clear(); Console.WriteLine("Нажмите для выбора файла..."); Console.ReadKey(); OpenFileDialog _OFD = new OpenFileDialog(); if ((_OFD.ShowDialog()) != DialogResult.OK) { Console.Clear(); Console.WriteLine("Не выбран файл"); Console.ReadKey(); _TransferData(); } string[] _FileFullName = _OFD.FileName.Split('\\'); _FileName = Encoding.Default.GetBytes(_FileFullName[_FileFullName.Length - 1]); using (FileStream _FS = new FileStream(_OFD.FileName, FileMode.Open)) { _File = new Byte[_FS.Length]; _FS.Read(_File, 0, _File.Length); } Console.WriteLine("Обработка файла завершена. Соединение с сервером..."); using (Socket _ClientFI = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) { _ClientFI.Connect(_EndIP1); Console.WriteLine("Отправка информации о файле..."); _ClientFI.Send(_FileName); Console.WriteLine("Информация о файле отправлена..."); } Thread.Sleep(50); using (Socket _ClientFD = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) { _ClientFD.Connect(_EndIP2); Console.WriteLine("Отправка файла..."); _ClientFD.Send(_File); Console.WriteLine("Файл отправлен..."); } Console.ReadKey(); _TransferData(); } catch (Exception _ex) { Console.WriteLine(_ex); Console.ReadKey(); _TransferData(); } } }
Решение задачи: «Неполадки с передачей данных по сокетам»
textual
Листинг программы
} while (_ClientS.Available > 0);
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д