Неполадки с передачей данных по сокетам - 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);
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д