Неполадки с передачей данных по сокетам - 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);

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


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

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

8   голосов , оценка 3.5 из 5
Похожие ответы